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,...)应该返回什么?
我打算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
最大指数高一个.)
寓意:永远不要混淆一个浮点值什么是它是如何看起来.