【发布时间】:2020-10-16 20:23:40
【问题描述】:
<float.h> 中的常量 Apple clang version 12.0.0 (clang-1200.0.32.2) 似乎没有意义。
DBL_MIN_EXP 是 -1021 和 DBL_MAX_EXP 是 1024。但是,这与 wikipedia says 的内容不匹配,“指数范围从 -1022 到 +1023,...”
另外DBL_MIN_EXP 似乎与DBL_MIN 不一致,2.2250738585072014e-308 等于2⁻¹⁰²²,有时写为0x1.0000000000000p-1022。所以,我们有一个小于最小值-1021 的指数。
同样,DBL_MIN_10_EXP 是 -307,鉴于 DBL_MIN 的指数为 e-308,这没有意义。
1024 的双倍 DBL_MAX_EXP 值在实际代码中使用时会溢出。例如,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;
}
这是输出:
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
【问题讨论】:
-
你和其他系统的float.h文件比较了吗?我对 Windows 上的 gcc 有完全相同的结果
-
好吧,从 C 标准来看:最小负整数,使得 FLT_RADIX 提升到 小于 1 是一个归一化的浮点数,emin
-
for max: /* 最大 int x 使得 FLT_RADIX**(x-1) 是一个可表示的浮点数 emax。 */
标签: c floating-point constants ieee-754