浮点型存储时的精度损失
浮点型不能用==
来比较数据是否相等,因为浮点型数据在存储时会损失精度,可能大于原值也可能小于。
在下图中我们可以看到,编译器打印在屏幕上的的值和我们期望得到的值并不相等,数据可能变大,也可能变小。
这与浮点型在内存中的存取方式有关。
浮点型的存取方式
我的另一篇博客里详细解释了浮点数的存取方式是怎样的,点击链接查看。
我们知道,任何数据在内存中是以二进制的形式进行存储的,也就意味着浮点型数据的小数位在2进制下是有可能超出规定的比特位的。我们小数转二进制呢是用乘二取整法,比如0.3,0.3×2=0.6,整数位为0,则取比特位为0,然后用0.6×2=1.2,整数位为1,那么取比特位为1,然后以此类推,不断得到比特位,然后你会发现有些它会一直乘2,就是不等于0,而我们的比特位是有限的,也因此它会损失精度。
如何解决浮点型的比较大小的问题
要想比较两个浮点数的大小,我们需要确认一个精度,用两个浮点数相减之后的值与精度比较。
在下方代码中,我们的目的是比较确定a和b是否相等,那么只需要确认两数相减的绝对值是否在一精度内就行。
使用fabs函数计算,fabs函数是c语言库函数中取绝对值的函数,需包含头文件math.h
,
#include <stdio.h>
#include<math.h>
#include<float.h>
#define EPSILON 0.0000001//宏定义一个精度
int main()
{
double a = 1.0;
double b = 0.1;
//使用自定义精度计算
if((a-b) < EPSILON || (a-b)>EPSILON)
{
printf("a");
}
else
printf("b");
/*
使用库中精度和绝对值函数
if (fabs(a) - b < DBL_EPSILON)
printf("a");
else
printf("b");*/
return 0;
}
注:在语法上使用==
是没有问题的,< > >= <=
也都是没有问题的。