细说C语言【浮点数与0比较】
对于整数来说,要判断其是否等于0,只需写if(a==0)即可,但是浮点数该如何比较呢?
当我们给浮点数赋值123时,输出结果为123.000000
#include "stdio.h"
int main(){
float a = 123;
printf("%f\n",a);
return 0;
}
当我们使用%.50f标识double类型时就会发现出现误差
由此可见,程序输出的结果并不是其被赋予的值。即说明了浮点数存在一定的误差。而这个误差与本身的精度有关
首先,浮点数在计算机当中的二进制表达方式就决定了大多数浮点数都是无法精确表达的。现在的计算机大部分都是数字计算机,不是模拟机,数字机的离散化的数据表达方法自然无法精确表达大部分的数据量
计算机浮点数的精度在单精度float类型下,只有7位,在进行浮点运算的时候,这个精度往往会导致运算的结果和实际期望的结果之间有误差
那么浮点数到底该如何比较?
应该进行范围精度比较
//伪代码
if((x - y) > - 精度 && (x - y) < 精度)
{
//TODO;
}
//或者
if(fabs(x - y) < 精度)
{
//TODO;
}
_注:fabs是C语言函数库中求绝对值的_函数
精度:我们可以使用宏定义自己设置,也可以使用系统自带的精度
#include<stdio.h>
#include<float.h> //使用以下两个精度,需要包含改头文件。
DBL_EPSILON //double最小精度
FLT_EPSILON //float最小精度
我们转到定义查看FLT_EPSILON是一个加上n不等于n的最小正数
与0比较代码示例:
#include<float.h>
#include<stdio.h>
int main()
{
double x = 0.0000000000000000000000001;
//if (fabs(x) < DBL_EPSILON)
if (fabs(x - 0.0) < DBL_EPSILON)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
system("pause");
return 0;
}
EPSILON是希腊字母ε,同样也是普朗克量子力学中的最小能量值(能量子)
那么XXX_EPSILON是最小误差,是:XXX_EPSILON + n不等于n的最小的正数
总结:
-
浮点数存储的时候,是有精度的损失的;
-
浮点数是不能进行==比较的;
-
if(fabs(a - b) < DBL_EPSILON);
-
比较时,不能加等号;
相关文章
【数据结构】——哈夫曼树
速通回忆 这里是完整的代码和运行结果,可以直接选择看下面代码的思路去快速回忆哈夫曼树,或从下面理论部分开始学习 ``` #include "stdio.h" #include "stdlib.h" /* 哈夫曼树结点的结构体 */ typedef struct { int weight; /* 权重 */ int parent; /* 父母结点下标 */ int l...
强化C【C语言笔记】——位运算
位运算符C语言提供了六种位运算符 - &:按位与 - !:按位或 - ^:异或 - ~:取反 - <<:左移 - \>>:右移 按位与运算 **其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0** 按位与运算通常用来对某些位清0 按位或运算 **其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就...
C语言中规中矩的大树
**没事干,写个树玩玩,真正的“撸树”** 在Ubuntu终端、VScode终端显示 代码 ``` #include "stdio.h" int main(){ int high = 5; //层高 int count = 5; //层数 int start; //每层开始*数 int...