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

时间:2015-03-05 20:14:43

标签: c++ casting int double precision

我目前正在编写一个需要占据平方根的程序。由于取平方根的值I是正的,我只是将其转换为int。所以说以下示例:

int i = 16;
int j = std::sqrt(i)

j应为4。

我想知道,是否有可能sqrt返回3.9999999991而不是4.000000001或者其他什么,j的结果是3?是否有定义浮点行为的规则?如何正确地将其转换为int?

1 个答案:

答案 0 :(得分:4)

几乎所有广泛使用的硬件都使用IETF754浮点数,尽管C ++不需要它。

假设IETF754浮点数和::std::sqrt到IETF754浮点平方根运算的直接映射,您将得到以下保证:

  • 16和4都可以用浮点运算精确表示 - 实际上,双精度浮点数可以精确表示任何32位整数
  • 平方根返回最接近精确的结果

因此,您的示例will work fine

一般来说,你所暗示的问题可能会发生,但要解决它,你必须提出一个更大的问题:在哪种情况下,一个数字接近积分,真的是积分?

这实际上比看起来更难,因为你想要计算平方根的底限,因此简单的舍入对你不起作用。但是,一旦您自己回答了这个问题,实施解决方案应该相当简单。例如:

int i = 16;
int j = std::sqrt(i);
if((j + 1) * (j + 1) == i) j += 1;