8

<float.h>for中的常量Apple clang version 12.0.0 (clang-1200.0.32.2)似乎没有意义。

DBL_MIN_EXP-1021DBL_MAX_EXP1024然而,这与维基百科所说的不符,“指数范围从 -1022 到 +1023,......”

DBL_MIN_EXP似乎与DBL_MINwhich is 2.2250738585072014e-308which is equal to2⁻¹⁰²²有时写为不一致0x1.0000000000000p-1022。所以,我们有一个小于最小值的指数-1021

同样,DBL_MIN_10_EXPis -307which 没有意义,因为它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;
}

这是输出:

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
4

2 回答 2

9

off-by-one 是规范的一部分。从5.2.4.2.2 浮动类型的特征 <float.h>,¶11

...

  • 最小负整数,使得 FLT_RADIX 提高到该幂小一是归一化浮点数,emin
    • FLT_MIN_EXP
    • DBL_MIN_EXP
    • LDBL_MIN_EXP

...

  • 最大整数,使得 FLT_RADIX 提高到该幂小 1 是可表示的有限浮点数 emax
    • FLT_MAX_EXP
    • DBL_MAX_EXP
    • LDBL_MAX_EXP

强调我少一个。

于 2020-10-16T20:34:29.373 回答
1
于 2021-02-04T12:19:51.590 回答