在C语言中如何正确测试float浮点数值?现有零值校验写法是否正确?
C语言float类型判断是否为0的正确方式
你当前写法的问题
你现在的写法不是最优方案,甚至在绝大多数实用场景下是错误的,原因有两个:
- 浮点数存在精度误差:如果待判断的float值是经过计算得到的,原本理论上应该等于0的结果,可能因为计算过程中的精度损失变成极小的非0值(比如1e-8),这时候直接用
==判断相等会得到false,不符合预期 - 写法冗余:
x1 == 0.0f || x1 == 0.0完全没有必要,0.0是double类型,和float类型的x1比较时会发生隐式类型转换,多一次判断没有任何收益,反而增加不必要的运算
正确的校验方案
场景1:值为计算结果,允许精度误差
绝大多数场景下我们判断浮点数是否为0,都是允许在业务可接受的精度范围内的,这时候正确的做法是判断浮点数的绝对值小于预设的精度阈值:
#include <stdio.h> // 引入float.h可以用标准定义的FLT_EPSILON,也可以自己根据业务定义精度 #include <float.h> #include <math.h> int main() { float x1 = -105.00; float x2 = 7.00; float x3 = 2.00; // 也可以自定义阈值,比如要求精度到小数点后两位,就用1e-3 const float eps = FLT_EPSILON; if(fabsf(x1) < eps && fabsf(x2) < eps && fabsf(x3) < eps) { printf("full null\r\n"); } return 0; }
其中fabsf是专门求float类型绝对值的函数,比通用的fabs效率更高。
场景2:判断是否是精确赋值的0常量
如果你的float值是直接字面量赋值、没有经过任何计算,确实要判断是不是精确的0.0f,那直接写x == 0.0f即可,不需要冗余的或判断。
内容的提问来源于stack exchange,提问作者Clément
相关产品推荐
相关产品推荐

