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;