一些 C 浮点常量没有意义

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_EXP1024。然而,这与维基百科所说的不符,“指数范围从 ?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_EXP1024。例如,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)

R..*_*R.. 9

一对一是规范的一部分。来自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

强调少一个

  • 当您了解这两个表示与表示浮点数的 C 模型相关的属性(出现在标准引用部分的开头)而不是直接表示极值的属性时,“小于一”就有意义了他们自己。 (2认同)