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

如何判断两个浮点数是否相等

程序员文章站 2022-04-02 10:05:44
...

如何判断两个浮点数是否相等

众所周知,在C/C++语言中,两个整形类型的数字是可以直接用==进行比较的,而两个浮点类型的数据是不能直接用 = = 符号进行比较的。

不能直接进行比较的原因是:

1.0000001 和 1.0 这两个数在绝大多数的情况下,认为它们是相等的,所以经常能看到如下的 C 或者 C++ 代码 if(fabs(a-b)<=eps_0) ,一般地,eps_0设置为很小的数,比如1.0e-6 或者 1.0e-7,直观地来讲,就是说当两个数之间的距离(称为绝对误差)很小很小的时候,我们就认为它们是相等的。

浮点型数据在内存中的存储

  • 根据IEEE(电器和电子工程协会)754,任意一个二进制浮点数v可以表示成下面的形式:
    (-1)^S *M *2^E
    (-1)^S表示符号位,当S=0,V为正数,当S=1,V为负数
    M表示有效数字,大于等于1,小于等于2
    2^E表示指数位

IEEE754规定,对于32位浮点数,最高位1位是符号位s,接着的8位是指数E,最后的23位为有效数字M;对于64位浮点数,最高位1位是符号位S,接着11位是指数E,剩下的52位为有效数字M,存M只存小数点后面的位。针对E来说,E为一个无符号整数,这意味着如果E为8位,他的取值范围为0-255,如果E为11位,他的取值范围为0-2047,但是我们知道,科学计数法中的E是可以出现负数的,,所以IEEE754规定,存入内存时,E的真实值,必须加上一个中间数,对于8位的E中间数为127,对于11位的E,中间数为1023.

float 和double类型的区别

float32位中,1位符号位,8位指数位,23位尾数位
double64位中,1位符号位,11位指数位,52位尾数位

一般float型只能精确到小数后六位(即1e-6),将float型数据的绝对值与1e-6比较,来判断是否相等

  • float的精度误差在1e-6;
    所以要判断一个float型数:if(fabs(f) < 1e-6);
    若满足,则相等
  • double精度误差在1e-15
    要判断一个double型数:if(fabs(f) < 1e-15);
    若满足,则相等

eg:

if(fabs(a-b) < 1e-6)
{
	printf("a等于b\n");
}
else
{
	printf("a不等于b");
}
fabs()是对浮点数求绝对值,abs()是对整数求绝对值。

fabs()的函数原型为:

double fabs( double x );
头文件为#include<math.h>
fabs returns the absolute value of its argument. There is no error return.
相关标签: C/C++