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

mat*_*t88 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

frexp(0x1.fffffep+127) = {1.000000, 128}
Run Code Online (Sandbox Code Playgroud)

IEEE 754维基百科文章中我看到"最大规范化数字"的指数为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,...)应该返回什么?

ric*_*ici 5

我打算FLT_MAX%a格式打印出来,因此您可以看到实际值是什么,而不是将其%f打印出来.那么为什么不这样做mant呢?

frexp(0x1.fffffep+127) = {0x1.fffffep-1, 128}
Run Code Online (Sandbox Code Playgroud)

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

寓意:永远不要混淆一个浮点值什么它是如何看起来.