欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浮点数的比较

程序员文章站 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 的分支。