Некоторые вопросы о точности и числовых пределах с плавающей точкой - PullRequest
2 голосов
/ 12 мая 2011

Я знаю, что есть множество подобных вопросов, но я не мог найти свои ответы.Пожалуйста, прочитайте перед голосованием, чтобы закрыть (:

The numeric coprocessor has eight floating point registers. 
Each register holds 80 bits of data. 
Floating point numbers are always stored as 80-bit 
extended precision numbers in these registers.

Как это возможно, когда sizeof показываетразные вещи. Например, в архитектуре x64 размер double равен 8, а это далеко от 80 бит.

  • почему std::numeric_limits< long double >::max() дает мне 1.18973e+4932?! Этоэто huuuuuuuuuuge число. Если это не способ получить максимум чисел с плавающей запятой, то почему это компилируется вообще, и даже больше - почему это возвращает значение.

  • что делаетэто означает:

Double precision magnitudes can range from approximately 10^−308 to 10^308 

Это огромные числа, вы не можете сохранить их в 8B или даже 16B (что является повышенной точностью и составляет всего 128 бит)?

Очевидно, я что-то упускаю. На самом деле, очевидно, много вещей.

Ответы [ 4 ]

4 голосов
/ 12 мая 2011

1) sizeof - это размер в памяти, а не в регистре.sizeof в байтах, поэтому 8 байтов = 64 бита.Когда двойники вычисляются в памяти (на этой архитектуре), они получают дополнительные 16 бит для более точных промежуточных вычислений.Когда значение копируется обратно в память, лишние 16 бит теряются.

2) Как вы думаете, почему long double не достигает 1.18973e + 4932?

3)Почему вы не можете хранить 10 ^ 308 в 8 байтах?Мне нужно только 13 бит: 4 для хранения 10 и 9 для хранения 308.

1 голос
/ 12 мая 2011
  1. A double - это не 80-битная с плавающей точкой Intel сопроцессор, это 64-битная IEEE 754 с плавающей точкой.С sizeof (double) вы получите размер последнего.

  2. Это правильный способ получить максимальное значение для long double, поэтому ваш вопрос бессмыслен.

  3. Возможно, вам не хватает того, что числа с плавающей запятой не являются точными числами.10 ^ 308 не хранит 308 цифр, только около 19 цифр.

0 голосов
/ 12 мая 2011

Число с плавающей точкой на компьютере представлено в соответствии с IEEE 754-2008.

Он определяет несколько форматов, среди которыхдвоичная32 = одинарная точность,двоичная64 = двойная точность иbinary128 = Четырехкратная точность являются наиболее распространенными.http://en.wikipedia.org/wiki/IEEE_754-2008#Basic_formats

Число с двойной точностью имеет 52 бита для цифры, которая дает точность, и 10 бит для показателя степени, который дает размер числа.Таким образом, удваиваются 1.xxx (52 двоичных цифры) * 2 ^ экспонента (10 двоичных цифр, поэтому до 2 ^ 10 = 1024)

И 2 ^ 1024 = 1,79 * 10 ^ 308Вот почему это самое большое значение, которое вы можете сохранить в двойном размере.

При использовании числа с четверной точностью они равны 112 битам и 14 разрядам для показателя степени, поэтому наибольшим показателем является 16384.

Поскольку 2 ^ 16384 дает 1,18 * 10 ^ 4932, вы видите, что ваш тест на C ++ был совершенно правильным и что на x64 ваш double фактически хранится в числе с четверной точностью.

0 голосов
/ 12 мая 2011

Размер пространства, которое использует 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 / для получения информации о плавающей точке.

...