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