Размер пространства, которое использует FPU, и объем пространства, используемого в памяти для представления double
, - это две разные вещи. IEEE 754 (который, вероятно, используется в большинстве архитектур) определяет 32-битные числа с одинарной точностью и 64-битные числа с двойной точностью, поэтому sizeof(double)
дает вам 8 байтов. Intel x86 выполняет математику с плавающей запятой внутри, используя 80 бит.
std::numeric_limits< long double >::max()
дает вам правильный размер для long double
, который обычно составляет 80 бит. Если вы хотите максимальный размер для 64-битного двойного, вы должны использовать его в качестве параметра шаблона.
На вопрос о диапазонах, как вы думаете, почему вы не можете хранить их в 8 байтах? Они do на самом деле соответствуют, и вам не хватает того, что в крайних точках диапазона есть число, которое невозможно представить (например, показатель степени около 308, есть много много целых чисел, которые не могут ' быть представленными вообще).
См. Также http://floating -point-gui.de / для получения информации о плавающей точке.