C++ - 如何正确地将 double 转换为 int
C++ - How to correctly cast double to int
我目前正在编写一个需要对平方根取底的程序。因为我取平方根的值是正数,所以我只是将它转换为 int。所以说下面的例子:
int i = 16;
int j = std::sqrt(i)
j 应该是 4。
不过我想知道,是否有可能 sqrt returns 3.9999999991 而不是 4.000000001 或其他什么,而 j 的结果是 3?是否有定义浮点行为的规则?我怎样才能正确地将其转换为 int?
几乎所有广泛使用的硬件都使用 IETF754 浮点数,尽管 C++ 不需要它。
假设 IETF754 浮点数和 ::std::sqrt
到 IETF754 浮点平方根运算的直接映射,您可以放心:
- 16 和 4 都可以用浮点运算精确表示——事实上,双精度浮点数可以精确表示任何 32 位整数
- 平方根 returns 最接近精确的结果
因此,您的示例 will work fine。
一般情况下,你暗示的问题是有可能发生的,但要解决这个问题你得问一个更大的问题:在什么情况下接近整数的数才是真正的整数?
这实际上比看起来更难,因为您要计算平方根的下限,因此简单的四舍五入对您不起作用。但是,一旦您自己回答了这个问题,实施解决方案就会变得相当简单。例如:
int i = 16;
int j = std::sqrt(i);
if((j + 1) * (j + 1) == i) j += 1;
我目前正在编写一个需要对平方根取底的程序。因为我取平方根的值是正数,所以我只是将它转换为 int。所以说下面的例子:
int i = 16;
int j = std::sqrt(i)
j 应该是 4。
不过我想知道,是否有可能 sqrt returns 3.9999999991 而不是 4.000000001 或其他什么,而 j 的结果是 3?是否有定义浮点行为的规则?我怎样才能正确地将其转换为 int?
几乎所有广泛使用的硬件都使用 IETF754 浮点数,尽管 C++ 不需要它。
假设 IETF754 浮点数和 ::std::sqrt
到 IETF754 浮点平方根运算的直接映射,您可以放心:
- 16 和 4 都可以用浮点运算精确表示——事实上,双精度浮点数可以精确表示任何 32 位整数
- 平方根 returns 最接近精确的结果
因此,您的示例 will work fine。
一般情况下,你暗示的问题是有可能发生的,但要解决这个问题你得问一个更大的问题:在什么情况下接近整数的数才是真正的整数?
这实际上比看起来更难,因为您要计算平方根的下限,因此简单的四舍五入对您不起作用。但是,一旦您自己回答了这个问题,实施解决方案就会变得相当简单。例如:
int i = 16;
int j = std::sqrt(i);
if((j + 1) * (j + 1) == i) j += 1;