【问题标题】:Why float taking 0.699999 instead of 0.7 [duplicate]为什么浮动采用 0.699999 而不是 0.7 [重复]
【发布时间】:2013-07-10 20:42:23
【问题描述】:

这里 x 取 0.699999 而不是 0.7,但 y 取 0.5 作为分配。你能告诉我这种行为的确切原因是什么。

#include<iostream>
using namespace std;

int main()
{
float x = 0.7;
float y = 0.5;
if (x < 0.7)
{
if (y < 0.5)
   cout<<"2 is right"<<endl;
else 
   cout<<"1 is right"<<endl;
}
else 
   cout<<"0 is right"<<endl; 

cin.get();
return 0;
}

【问题讨论】:

标签: c++ visual-c++ floating-point dev-c++


【解决方案1】:

互联网上有很多关于 IEEE 浮点的东西。

0.5 = 1/2

so 可以完全写成 2 的幂次之和

0.7 = 7/10 = 1/2 + 1/5 = 1/2 + 1/8 + a bit more... etc

bit more 永远不可能是 2 的幂,所以你可以得到最接近的结果。

【讨论】:

    【解决方案2】:

    这与浮点在内存中的表示方式有关。它们的位数有限(float 通常为 32)。这意味着可以表示的值数量有限,这意味着无法表示无限实数集中的许多数字。

    This website explains further

    【讨论】:

      【解决方案3】:

      如果您想确切了解原因,请查看您机器的浮点表示(很可能是 IEEE 754,https://en.wikipedia.org/wiki/IEEE_floating_point)。

      如果您想编写健壮且可移植的代码,切勿比较浮点值是否相等。您应该始终以某种精度比较它们(例如,您应该写 fabs(x-y) &lt; eps 而不是 x==y,其中 eps 是说 1e-6)。

      【讨论】:

        【解决方案4】:

        浮点表示只是近似的,因为您无法在计算机上精确表示实数、非有理数。 ` 在浮点数上操作时,错误通常会累积。

        然而,一些实数可以在数字计算机上使用它的本机数据类型精确表示 (*),0.5 就是其中之一。

        (*) 表示 CPU 的浮点处理单元操作的格式(在 ieee754 中标准化)。专门的库可以表示整数和有理数,完全超出处理器内部格式的限制。转换为人类可读的十进制扩展时仍可能发生舍入错误,并且替代方案也不会扩展到无理数(例如 sqrt(3))。当然,这些库是以降低速度为代价的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-20
          • 2011-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-19
          相关资源
          最近更新 更多