以下程序的输出应该是什么?
#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,...)应该返回什么?
答案 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
最大指数高一个。)
道德:从不混淆浮点值 与看起来的内容。