以下程序的输出应该是什么?
#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, ...) 应该返回什么?