2015-05-05 4 views
1

Я только что прочитал о стандарте IEEE 754, чтобы понять, как реализованы плавающие точки single-precision и double-precision.Понимание DBL_MAX

Так что я написал это, чтобы проверить мое понимание:

#include <stdio.h> 
#include <float.h> 

int main() { 
    double foo = 9007199254740992; // 2^53 
    double bar = 9007199254740993; // 2^53 + 1 

    printf("%d\n\n", sizeof(double)); // Outputs 8. Good 
    printf("%f\n\n", foo); // 9007199254740992.000000. Ok 
    printf("%f\n", bar); // 9007199254740992.000000. Ok because Mantissa is 52 bits 
    printf("%f\n\n", DBL_MAX); // ?? 

    return 0; 
} 

Выход:

8 

9007199254740992.000000 

9007199254740992.000000 

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 

То, что я не понимаю, что я ожидал, что последняя строка моего выхода, чтобы быть: (2^53-1) * 2^(1024-52), но число на последней строке соответствует приблизительно 2^(2^10). Что мне не хватает? Как точно вычисляется DBL_MAX?

EDIT: Небольшого пояснение о точного значения из DBL_MAX:

Как объяснены в принятом ответе наибольшего значение показателя составляет 2^1023, а не 2^1024, как я учил. Таким образом, значение DBL_MAXточной является: (2^53-1)*(2^(1023-52)) (так, как и ожидалось, это немного меньше, чем 2^10, так как мантисса немного меньше, чем 2)

+1

'% d' требует аргумент типа' int'. 'sizeof' дает значение типа' size_t'. Используйте '% zu' для печати:' printf ("% zu \ n", sizeof (double)); '. Использование '% d' может работать, в зависимости от характеристик вашей системы, но это ненадежно. –

+0

Да, вы правы. Это было просто для теста :) –

ответ

4

Double представлены как m*2^e где m является мантисса и e является показателем. У парного разряда 11 бит для экспоненты. Поскольку показатель может быть отрицательным, существует смещение 1023. Это означает, что реальный расчет равен m*2^(e-1023). Наибольшее 11-битное число - 2047. Показатель 2047 зарезервирован для хранения inf и NaN. Это означает, что наибольший двойной - m*2^(2046-1023) = m*2^(1023). Мантисса является числом от 1 и 2. Это означает, что самый большой двойной достигается, когда m почти 2. Таким образом, мы имеем:

DBL_MAX = max(m)*2^1023 ~ 2*2^1023 = 2^1024 = 2^(2^10) 

Как вы можете видеть here это в значительной степени стандартное значение DBL_MAX.

+0

Да, извините, должно быть, удалили его по ошибке. –

+0

Полностью верный, но смещение экспоненты составляет 1023, а максимальный показатель зарезервирован для бесконечности и nan, поэтому DBL_MAX имеет показатель 2046-1023 = 1023. –

1

DBL_MAX является крупнейшим значение двойной может содержать , Его значение не связано с количеством бит в мантиссе.

Предел в основном связан с максимальным показателем экспоненты. Для IEEE-754 это около 1.8e + 308 или 2^1023.

Определение обычно #define DBL_MAX 1.79769313486231470e+308

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

  • Нет связанных вопросов^_^