一篇文章带你了解C语言浮点数之间的比较规则
程序员文章站
2022-03-25 23:44:27
目录你认为这段代码输出什么?int main(){float f1 = 1.1;float f2 = 2.2;if (f2 - 1.1 == f1)printf("等于");elseprintf("不...
你认为这段代码输出什么?
int main() { float f1 = 1.1; float f2 = 2.2; if (f2 - 1.1 == f1) printf("等于"); else printf("不等于"); return 0; }
答案是不等于。
为什么不等于呢?
因为在c语言中浮点数是存在精度损失的,有可能比原来的数大,也有可能小。 在下图所示,f1在打印小数点后30位时就能很明显的看出存在精度损失。
应该怎么解决?
浮点数不能直接用 == 号比较。那么应该怎么比较呢。
这里要引出精度这个概念,精度可以理解为引发一个浮点数发生改变的最小值。
当一个浮点数加上精度或者减去精度,都不等于该数本身。
精度可以是自己定义的,也可以用c语言自带的,它定义在 float.h 头文件中。
#define flt_epsilon 1.192092896e-07f // smallest such that 1.0+flt_epsilon != 1.0 #define dbl_epsilon 2.2204460492503131e-016 // smallest such that 1.0+dbl_epsilon != 1.0
flt_epsilon 为float类型的默认精度,dbl_epsilon 为double类型的精度。
那么怎么判断两个浮点数 f1 和 f2 相等呢。
虽然两个浮点数存在精度上的误差,但这个误差非常小,只要(f2 - f1)这个差值在负精度到正精度的区间内,就可以认为它们相等。
如图,它们的差值必须在 (-xxx_epsilon,xxx_epsilon) 这个区间内,才能说明它们相等。
伪代码
if(f2 - f1) > -xxx_epsilon && (f2 - f1)< xxx_epsion){相等;}
可以简化为 >>
if (fabs(f2 - f1) < xxx_epsilon) //fabs函数求绝对值,在math.h头文件中{相等;}
怎么判断浮点数等于0?
这个浮点数的绝对值小于精度,可以认为这个数为0。
if (fabs(f1) < xxx_epsilon) { //f1为0 }
还有一个问题
// 判断f1为0的条件 < 能换成 <= 吗
if (fabs(f1) < xxx_epsilon) ->> if (fabs(f1) <= xxx_epsilon)
0的性质:任何数加上0,都等于它本身。
而上述也讲了精度的定义为浮点数加上xxx_esilon 都会发生改变,如果 f1 可以等于 xxx_esilon ,不是说一个浮点数加上0会发生改变吗,这明显不符合0的性质。所以是开区间,只能是 < 。
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注的更多内容!
上一篇: 纯c语言优雅地实现矩阵运算库的方法
下一篇: 日常收集整理的Git常用命令