为什么浮动乘以0.699999而不是0.7

时间:2013-07-12 10:17:30

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

这里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;
}

4 个答案:

答案 0 :(得分:11)

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

0.5 = 1/2

所以可以写成两个权力的总和

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

bit more永远不会是两个人的力量,所以你可以得到最接近它的能力。

答案 1 :(得分:0)

浮点表示仅是近似值,因为您无法在计算机上精确表示真实的非有理数。 ` 当对浮子进行操作时,errros通常会积累。

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

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

答案 2 :(得分:0)

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

This website explains further

答案 3 :(得分:0)

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

如果要编写健壮且可移植的代码,请不要将浮点值进行相等性比较。您应该始终以一定的精度对它们进行比较(例如,而不是x==y,您应该写fabs(x-y) < eps eps1e-6)。