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

时间:2013-08-17 03:04:22

标签: c floating-point ieee-754

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

#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;
}

在我的amd64 Linux系统上使用glibc打印:

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

the IEEE 754 Wikipedia article我看到“最大标准化数字”的指数为127.我也看到指数为128的唯一值是±Infinity和NaN。

the frexp man page我明白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,...)应该返回什么?

1 个答案:

答案 0 :(得分:5)

我赞成以FLT_MAX格式打印%a,因此您可以看到实际值是什么,而不是%f将其打印为。那么为什么不为mant的价值做呢?

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

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

道德:从不混淆浮点值 看起来的内容。