这里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;
}
答案 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位)。这意味着可以表示的数值有限,这意味着无法表示无限实数集中的许多数字。
答案 3 :(得分:0)
如果您想了解具体原因,请查看您机器的浮点表示(最有可能是IEEE 754,https://en.wikipedia.org/wiki/IEEE_floating_point)。
如果要编写健壮且可移植的代码,请不要将浮点值进行相等性比较。您应该始终以一定的精度对它们进行比较(例如,而不是x==y
,您应该写fabs(x-y) < eps
eps
说1e-6
)。