2013-08-17 3 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.

От 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

Действительно, вы совершенно правы. Я должен был напечатать оба поплавка с% а, чтобы увидеть, что на самом деле происходит. – mattst88

Смежные вопросы