0

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

4 回答 4

11

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

0.5 = 1/2

所以可以写成两个的幂的和

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

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

于 2013-07-12T10:21:19.857 回答
0

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

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

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

于 2013-07-12T10:21:14.407 回答
0

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

本网站进一步解释

于 2013-07-12T10:22:26.437 回答
0

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

如果您想编写健壮且可移植的代码,请不要比较浮点值是否相等。您应该始终以某种精度比较它们(例如,x==y您应该写fabs(x-y) < epswhere epsis say而不是1e-6)。

于 2013-07-12T10:22:30.477 回答