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

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

众所周知,在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.
发布了80 篇原创文章 · 获赞 84 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43831728/article/details/105198427