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