float.h
<float.h> 定义浮点类型的实现相关特性:最大值、最小值、精度、指数范围等。这些常量帮助编写可移植的浮点代码,避免硬编码平台相关值。
主要常量
#include <float.h>
/* float */
FLT_MIN; /* 最小正规约数:~1.18e-38 */
FLT_MAX; /* 最大正规约数:~3.40e+38 */
FLT_EPSILON; /* 1.0 + eps != 1.0 的最小值:~1.19e-7 */
FLT_DIG; /* 十进制精度位数:通常 6 */
FLT_MANT_DIG; /* 尾数位数:通常 24 */
FLT_MIN_EXP; /* 最小指数 */
FLT_MAX_EXP; /* 最大指数 */
/* double */
DBL_MIN; /* ~2.23e-308 */
DBL_MAX; /* ~1.80e+308 */
DBL_EPSILON; /* ~2.22e-16 */
DBL_DIG; /* 通常 15 */
/* long double */
LDBL_MIN;
LDBL_MAX;
LDBL_EPSILON;
使用示例
浮点比较:
#include <math.h>
#include <float.h>
int float_equal(float a, float b)
{
return fabsf(a - b) < FLT_EPSILON;
}
/* 更好的相对比较 */
int float_equal_rel(float a, float b)
{
float diff = fabsf(a - b);
float max = fmaxf(fabsf(a), fabsf(b));
return diff < max * FLT_EPSILON;
}
范围检查:
float safe_divide(float a, float b)
{
if (fabsf(b) < FLT_EPSILON) {
/* 除数接近零 */
return FLT_MAX;
}
return a / b;
}
常见错误
硬编码浮点常量:
/* 错误:假设 float 范围 */
if (x > 3.4e38f) { /* 可能不精确 */
}
/* 正确 */
if (x > FLT_MAX) {
}
用 == 比较浮点:
/* 错误 */
if (x == 0.1) { /* 可能永远为假 */
}
/* 正确 */
if (fabs(x - 0.1) < DBL_EPSILON) {
}
最佳实践
- 用
FLT_/DBL_常量而非硬编码 - 浮点比较用 epsilon
- 理解精度限制
- 注意
FLT_EPSILON是相对于 1.0 的 - 金融计算考虑定点数或专用库