首先我们先来看一段代码:
#include <stdio.h>
int main()
{
double x = 1.0;
double y = 0.1;
printf("%.50f\n", x - 0.9);
printf("%.50f\n", y);
return 0;
}
我们可以看到结果并不是我们想象的那样,浮点数在内存中发生了精度损失,这里的精度损失,并不一样时丢失了数位,既然浮点数不能直接的进行比较和计算,那我们如何比较两个浮点数是否相等呢?
#include <stdio.h>
int main()
{
double x = 1.0;
double y = 0.1;
printf("%.50f\n", x - 0.9);
printf("%.50f\n", y);
if ((x - 0.9) == y)
{
printf("you can see me!");
}
else
printf("oops!");
return 0;
}
根据运算的结果可知,浮点数在进行比较的时候,绝对不能直接使用==来进行比较,浮点数本身有精度损失,导致结果有细微差别
那我们就不能进行浮点数的比较了吗?当然还是有办法结果这个问题的:
#include <stdio.h>
#define EPSILON 0.0000000001
int main()
{
double x = 1.0;
double y = 0.1;
printf("%.50f\n", x - 0.9);
printf("%.50f\n", y);
if ((x-0.9)-0.1>-EPSILON&&(x-0.9)-0.1<EPSILON)
{
printf("you can see me!");
}
else
printf("oops!");
return 0;
}
这时候我们需要定义一个精度,再次范围内我们都可以说他们相等
也可以利用fabs 函数将代码简化,在c语言中系统也为我们提供了精度大小
因此以后在判断两个浮点数是否相等的时候我们就可以:
#include<float.h>
#include<math.h>
int main()
{
double x = 1.0;
double y = 0.1;
if (fabs((x - 0.9) - 0.1) < DBL_EPSILON)
{
printf("you can see me!\n");
}
else
{
printf("oops\n");
}
return 0;
}
这样就解决了关于浮点之间的比较了,
总结一下今天的内容:
1】浮点数浮点数在存储的时候会发生精度损失
2】浮点数是不能进行==比较的
3】if(fabs(a-b)<DBL_EPSILON)