浮点数的比较
程序员文章站
2022-03-02 10:33:42
...
九层妖塔 起于垒土
浮点数的比较
float 型的有效位数是 6 位,那么我们在用 float 型运算时就要注意了,来看下面这段程序:
#include <stdio.h>
int main(void)
{
float a = 9.87654321;
float b = 9.87654322;
if(a > b)
{
printf("a > b\n");
}
else if(a == b)
{
printf("a == b\n");
}
else
{
printf("a < b\n");
}
return 0;
}
按照我们平时的经验来说这段程序应该走a < b
的分支,但程序运行的结果却走了 a ==b
的分支,原因就是 float 型的精度问题,float 型无法区分出小数点后的第 8 位数,在内存中,a 和 b 的二进制数都是 0x411E0652,因此就走了a== b
的分支。
某些编译器在编译时会发现 a 和 b 的值超出了浮点数的精度,会产生一个告警,提示数据超过精度,但有些编译器则不会做任何提示。最可怕的是有一类编译器,调试窗口里显示的长度超出 float 型的精度,比如说 a 的值显示为 9.87654321,b 的值显示为 9.87654322,但在运行时,硬件可不管这套,硬件认为这 2 个数都是 0x411E0652,因此实际运行结果是 a ==b
的分支。
上一篇: Qt使用字体图标fontawesome
下一篇: 浮点数的比较