Какой должен быть выход следующей программы?Что должно возвращать 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.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