Ray*_*ger 8 c floating-point constants ieee-754
<float.h>for 中的常量Apple clang version 12.0.0 (clang-1200.0.32.2)似乎没有意义。
DBL_MIN_EXP是-1021并且DBL_MAX_EXP是1024。然而,这与维基百科所说的不符,“指数范围从 ?1022 到 +1023,......”
也DBL_MIN_EXP似乎与DBL_MINwhich is 2.2250738585072014e-308which is equal不一致,2?¹?²²有时写为0x1.0000000000000p-1022. 所以,我们有一个小于最小值的指数-1021。
同样,DBL_MIN_10_EXPis-307没有任何意义,因为它DBL_MIN的指数为e-308。
在实际代码中使用时溢出的双精度DBL_MAX_EXP值1024。例如,ldexp(1.0, 1024)给出inf.
这是我的 C 代码:
#include <float.h>
#include <stdio.h>
#include <math.h>
#define SHOW_DOUBLE(s) printf("%.17lg \t%s\n", s, #s);
#define SHOW_INT(s) printf("%d \t%s\n", s, #s);
int
main()
{
SHOW_DOUBLE(DBL_MAX);
SHOW_DOUBLE(DBL_MIN);
SHOW_DOUBLE(DBL_EPSILON);
SHOW_INT(DBL_MAX_EXP);
SHOW_INT(DBL_MAX_10_EXP);
SHOW_INT(DBL_MIN_EXP);
SHOW_INT(DBL_MIN_10_EXP);
SHOW_INT(DBL_DIG);
SHOW_INT(DBL_MANT_DIG);
SHOW_INT(FLT_RADIX);
SHOW_INT(FLT_ROUNDS);
printf("%lf\n", ldexp(1.0, 1024));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
1.7976931348623157e+308 DBL_MAX
2.2250738585072014e-308 DBL_MIN
2.2204460492503131e-16 DBL_EPSILON
1024 DBL_MAX_EXP
308 DBL_MAX_10_EXP
-1021 DBL_MIN_EXP
-307 DBL_MIN_10_EXP
15 DBL_DIG
53 DBL_MANT_DIG
2 FLT_RADIX
1 FLT_ROUNDS
inf
Run Code Online (Sandbox Code Playgroud)
一对一是规范的一部分。来自5.2.4.2.2 浮动类型的特征 <float.h>, ¶11 ,
...
- 最小负整数,使得 FLT_RADIX 增加到小于 1该幂的 1 是归一化浮点数 emin
- FLT_MIN_EXP
- DBL_MIN_EXP
- LDBL_MIN_EXP
...
- 使 FLT_RADIX 增加到小于 1 的最大整数该幂的是可表示的有限浮点数 emax
- FLT_MAX_EXP
- DBL_MAX_EXP
- LDBL_MAX_EXP
强调比我少一个。