C++ - 如何正确地将 double 转换为 int

标签 c++ casting int double precision

我目前正在编写一个需要对平方根取底的程序。因为我取平方根的值是正数,所以我只是将它转换为 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/

相关文章:

c++ - 如何将英特尔 C++ 编译器与 CUDA nvcc 一起使用?

c++ - 如何在 C++ 代码中找到性能瓶颈

haskell - 将 [Int] 转换为 [Word8]

mysql - 如何在 MySQL 中将一个数字与一个单词连接起来?

c++ - 同一地址的变量如何产生 2 个不同的值?

java - 如何从 static void 方法返回 int 数据到 main 方法?

java,如何在不重复的情况下查找字符串中的字母数量

java - 在java中获取整数后的输入字符串时出错

c# - 如何获取每个进程的带宽?

c++ - GCC 共享库问题