0

以下程序的输出应该是什么?

#include <stdio.h>
#include <math.h>
#include <float.h>

int main() {
    int exp;
    float mant = frexp(FLT_MAX, &exp);
    printf("frexp(%a) = {%f, %d}\n", FLT_MAX, mant, exp);
    return 0;
}

在我的带有 glibc 的 amd64 Linux 系统上,它打印:

frexp(0x1.fffffep+127) = {1.000000, 128}

IEEE 754 Wikipedia 文章中,我看到“最大归一化数”的指数为 127。我还看到指数为 128 的唯一值是 ±Infinity 和 NaN。

frexp 手册页中,我了解到 frexp() 应该返回 [0.5, 1.0) 范围内的值(即不包括 1.0)。

根据这些信息,返回的尾数和指数似乎都不正确。

知道 frexp() 的作用和 FLT_MAX (= (2 - 2^-23) * 2^127) 的值告诉我 {1.0, 128} 确实非常接近正确答案,因为 (2 - 2^- 23) 非常接近 2。

那么 frexp(FLT_MAX, ...) 应该返回什么?

4

1 回答 1

6

我感谢您FLT_MAX%a格式打印,因此您可以看到实际值是什么,而不是%f打印出来的值。那么为什么不为 的价值也这样做mant呢?

frexp(0x1.fffffep+127) = {0x1.fffffep-1, 128}

这个结果对我来说似乎不足为奇。(请注意,IEEE-754 表示中的指数基于 range 中的尾数[1.0, 2.0),而在 range 中frexp生成尾数[0.5, 1.0)。因此frexp最大指数高一倍。)

道德:永远不要将浮点值它的外观混淆。

于 2013-08-17T05:43:44.570 回答