【问题标题】:C++ - How to correctly cast double to intC++ - 如何正确地将 double 转换为 int
【发布时间】:2015-03-05 20:14:43
【问题描述】:

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

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

j 应该是 4。

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

【问题讨论】:

  • int integer = std::round(floating_point);
  • 如果你关心四舍五入有点相关:stackoverflow.com/questions/485525/round-for-float-in-c
  • @DieterLücking 我认为这会四舍五入到最近,而这里想要的结果是从“真正的”平方根向下舍入。例如。 sqrt(16) -> 4, sqrt(15) ->3
  • @DrewDormann 对,这就是我们想要的结果。我已经考虑过使用 +0.5 方法,但它在这里行不通,因为 sqrt(15) = 3.87 + 0.5 = 4.37 会根据需要转换为 4 而不是 3。

标签: c++ casting int double precision


【解决方案1】:

几乎所有广泛使用的硬件都使用 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;

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2015-03-18
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多