'float' против 'двойной' точности - PullRequest
142 голосов
/ 24 февраля 2011

код

float x  = 3.141592653589793238;
double z = 3.141592653589793238;
printf("x=%f\n", x);
printf("z=%f\n", z);
printf("x=%20.18f\n", x);
printf("z=%20.18f\n", z);

даст вам вывод

x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116

где в третьей строке вывода 741012573242 - мусор, а в четвертой строке 116 - мусор. У двойников всегда есть 16 значащих цифр, а у чисел с плавающей запятой всегда 7 значащих цифр? Почему у двойников 14 значащих цифр?

Ответы [ 6 ]

134 голосов
/ 24 февраля 2011

Числа с плавающей запятой в C используют IEEE 754 кодирование.

Этот тип кодирования использует знак, значение и показатель степени.

Из-за этой кодировки многие числа будут иметь небольшие изменения, чтобы их можно было сохранить.

Кроме того, число значащих цифр может немного измениться, поскольку это двоичное представление, а не десятичное.

Одинарная точность (число с плавающей запятой) дает вам 23 бита значения и 8 битов показателя степени и 1 знаковый бит.

Двойная точность (double) дает вам 52 бита значений, 11 битов показателя степени и 1 знаковый бит.

38 голосов
/ 24 февраля 2011

У двойников всегда есть 16 значащих цифр, а у чисел с плавающей запятой всегда 7 значащих цифр?

Нет.Двойные числа всегда имеют 53 значащих битов , а плавающие всегда имеют 24 значимых битов (за исключением денормалов, бесконечностей и значений NaN, но они являются предметами для другого вопроса).Это двоичные форматы, и о точности их представления можно говорить только в терминах двоичных цифр (битов).

Это аналогично вопросу о том, сколько цифр может храниться в двоичном целом числе:32-разрядное целое число без знака может хранить целые числа длиной до 32 бит, которые точно не соответствуют ни одному количеству десятичных цифр: все целые числа до 9 десятичных цифр могут быть сохранены, но может быть сохранено много 10-значных чисела также.

Почему у двойников нет 14 значащих цифр?

Для кодирования двойника используются 64 бита (1 бит для знака, 11 бит дляпоказатель степени, 52 явных значащих бита и один неявный бит), что составляет double число битов, используемых для представления числа с плавающей запятой (32 бита).

11 голосов
/ 06 августа 2015

с плавающей запятой: 23 бита значений, 8 битов экспоненты и 1 знаковый бит.

double: 52 бита значений и, 11 битов показателя степени и 1 знаковый бит.

9 голосов
/ 24 февраля 2011

Число с плавающей запятой имеет 23 бита, а у двойного - 52.

9 голосов
/ 24 февраля 2011

Обычно оно основано на значимых показателях как показателя степени, так и значения в основании 2, а не на основании 10. Однако из того, что я могу сказать в стандарте C99, нет определенной точности для чисел с плавающей запятой и двойных чисел (кроме того факта, что1 и 1 + 1E-5 / 1 + 1E-7 различимы [float и double репрезентативно]).Тем не менее, количество значащих цифр оставлено на усмотрение разработчика (а также то, какую базу они используют внутри, поэтому, другими словами, реализация может принять решение сделать это на основе 18 цифр точности в базе 3).[1]

Если вам необходимо знать эти значения, константы FLT_RADIX и FLT_MANT_DIGDBL_MANT_DIG / LDBL_MANT_DIG) определены в файле float.h.

причина, по которой он называется double, заключается в том, что количество байтов, используемых для его хранения, вдвое больше числа с плавающей запятой (но это включает как показатель степени, так и значение).Стандарт IEEE 754 (используемый большинством компиляторов) выделяет относительно больше битов для значения и, чем показатель степени (от 23 до 9 для float против 52 до 12 для double), поэтому точность более чем удваивается.

1: раздел 5.2.4.2.2 (http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / n1256.pdf )

3 голосов
/ 24 февраля 2011

Это не совсем удвоенная точность из-за того, как работает IEEE 754 , а также из-за того, что двоичный код не очень хорошо переводится в десятичную. Посмотрите на стандарт, если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...