简介
C 标准库的 <float.h>
头文件包含了一组与浮点值相关的依赖于平台的常量。这些常量由 ANSI C 提出,使得程序更具可移植性。在讲解这些常量之前,我们先了解一下浮点数的组成部分:
- S:符号 ( +/- )
- b:指数表示的基数,2 表示二进制,10 表示十进制,16 表示十六进制,等等…
- e:指数,一个介于最小值 emin 和最大值 emax 之间的整数。
- p:精度,基数 b 的有效位数
基于以上 4 个组成部分,一个浮点数的值可以表示为:
floating-point = ( S ) p x b^e
或者
floating-point = (+/-) precision x base^exponent
库宏
下面的值是特定实现的,且是通过 #define
指令来定义的,这些值都不得低于下边所给出的值。请注意,所有的实例 FLT
是指类型 float
,DBL
是指类型 double
,LDBL
是指类型 long double
。
FLT_ROUNDS
定义浮点加法的舍入模式,它可以是下列任何一个值:
- -1:无法确定
- 0:趋向于零
- 1:去最近的值
- 2:趋向于正无穷
- 3:趋向于负无穷
#include <stdio.h> #include <float.h> int main() { printf("FLT_ROUNDS: %d\n", FLT_ROUNDS); return 0; }
FLT_RADIX
这个宏定义了指数表示的基数。基数 2 表示二进制,基数 10 表示十进制,基数 16 表示十六进制。
#include <stdio.h> #include <float.h> int main() { printf("FLT_RADIX: %d\n", FLT_RADIX); return 0; }
FLT_MANT_DIG, DBL_MANT_DIG, LDBL_MANT_DIG
这些宏定义了 FLT_RADIX
基数中的位数。
#include <stdio.h> #include <float.h> int main() { printf("FLT_MANT_DIG: %d\n", FLT_MANT_DIG); printf("DBL_MANT_DIG: %d\n", DBL_MANT_DIG); printf("LDBL_MANT_DIG: %d\n", LDBL_MANT_DIG); return 0; }
FLT_DIG, DBL_DIG, LDBL_DIG
这些宏定义了舍入后不会改变表示的十进制数字的最大值(基数 10)。
#include <stdio.h> #include <float.h> int main() { printf("FLT_DIG: %d\n", FLT_DIG); printf("DBL_DIG: %d\n", DBL_DIG); printf("LDBL_DIG: %d\n", LDBL_DIG); return 0; }
FLT_MIN_EXP, DBL_MIN_EXP, LDBL_MIN_EXP
这些宏定义了基数为 FLT_RADIX
时的指数的最小负整数值。
#include <stdio.h> #include <float.h> int main() { printf("FLT_MIN_EXP: %d\n", FLT_MIN_EXP); printf("DBL_MIN_EXP: %d\n", DBL_MIN_EXP); printf("LDBL_MIN_EXP: %d\n", LDBL_MIN_EXP); return 0; }
FLT_MIN_10_EXP, DBL_MIN_10_EXP, LDBL_MIN_10_EXP
这些宏定义了基数为 10 时的指数的最小负整数值。
#include <stdio.h> #include <float.h> int main() { printf("FLT_MIN_10_EXP: %d\n", FLT_MIN_10_EXP); printf("DBL_MIN_10_EXP: %d\n", DBL_MIN_10_EXP); printf("LDBL_MIN_10_EXP: %d\n", LDBL_MIN_10_EXP); return 0; }
FLT_MAX_EXP, DBL_MAX_EXP, LDBL_MAX_EXP
这些宏定义了基数为 FLT_RADIX
时的指数的最大整数值。
#include <stdio.h> #include <float.h> int main() { printf("FLT_MAX_EXP: %d\n", FLT_MAX_EXP); printf("DBL_MAX_EXP: %d\n", DBL_MAX_EXP); printf("LDBL_MAX_EXP: %d\n", LDBL_MAX_EXP); return 0; }
FLT_MAX_10_EXP, DBL_MAX_10_EXP, LDBL_MAX_10_EXP
这些宏定义了基数为 10 时的指数的最大整数值。
#include <stdio.h> #include <float.h> int main() { printf("FLT_MAX_10_EXP: %d\n", FLT_MAX_10_EXP); printf("DBL_MAX_10_EXP: %d\n", DBL_MAX_10_EXP); printf("LDBL_MAX_10_EXP: %d\n", LDBL_MAX_10_EXP); return 0; }
FLT_MAX, DBL_MAX, LDBL_MAX
这些宏定义最大的有限浮点值。
#include <stdio.h> #include <float.h> int main() { printf("FLT_MAX: %.10e\n", FLT_MAX); printf("DBL_MAX: %.10e\n", DBL_MAX); printf("LDBL_MAX: %.10Le\n", LDBL_MAX); return 0; }
FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON
这些宏定义了可表示的最小有效数字。
#include <stdio.h> #include <float.h> int main() { printf("FLT_EPSILON: %.10e\n", FLT_EPSILON); printf("DBL_EPSILON: %.10e\n", DBL_EPSILON); printf("LDBL_EPSILON: %.10Le\n", LDBL_EPSILON); return 0; }