以下程序的输出应该是什么?frexp(FLT_MAX,...)应该返回什么?
#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。
From 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,1.0]'应该是'[0.5,1.0]':) – 0decimal0
这应该不是什么'frexp()'返回的问题,但是应该像您自己说的那样使用什么精度*知道frexp()做了什么,并且FLT_MAX(=(2 - 2^-23)* 2^127)的值告诉我{1.0,128}确实非常接近正确答案,因为(2 - 2^23)非常接近2 *,这意味着你正在失去精度。尝试'double'而不是'float'。 – 0decimal0