2013-08-17 25 views
0

以下程序的输出应该是什么?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

'(0.5,1.0]'应该是'[0.5,1.0]':) – 0decimal0

+0

这应该不是什么'frexp()'返回的问题,但是应该像您自己说的那样使用什么精度*知道frexp()做了什么,并且FLT_MAX(=(2 - 2^-23)* 2^127)的值告诉我{1.0,128}确实非常接近正确答案,因为(2 - 2^23)非常接近2 *,这意味着你正在失去精度。尝试'double'而不是'float'。 – 0decimal0

回答

4

我给你信用印刷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最大指数是一个更高)

道德:决不混淆什么浮点数值与它如何看起来

+0

事实上,你是完全正确的。我应该用%a打印两个花车,看看发生了什么。 – mattst88

相关问题