Сколько десятичных знаков примитив с плавающей точкой и двойной поддержкой?
Я читал, что в двойных магазинах хранится 15 цифр, а в плавающих - 7 цифр.
Мой вопрос: эти числа - это число поддерживаемых десятичных знаков или общее количество цифр в числе?
4 ответа
Это общее количество "значащих цифр", если хотите, считая слева направо, независимо от того, где находится десятичная точка. Помимо этих цифр точность не сохраняется.
Количество, которое вы перечислили для базового 10 представлений.
Если вы используете архитектуру, использующую арифметику с плавающей запятой IEEE-754 (как в большинстве архитектур), тогда тип float
соответствует одинарной точности, а тип double
соответствует двойной точности, как описано в стандарте.
Давайте сделаем несколько цифр:
Одинарная точность:
32 бита для представления числа, из которых 24 бита предназначены для мантиссы. Это означает, что младший значащий бит (LSB) имеет относительное значение 2^(-24) по отношению к MSB, которое является "скрытым 1", и он не представлен. Следовательно, для фиксированного показателя минимальное представимое значение в 10^(-7,22) раза больше показателя. Это означает, что для представления в базовой записи степени (3.141592653589 E 25) значимы только десятичные числа "7,22", что на практике означает, что по крайней мере 7 десятичных знаков всегда будут правильными.
Двойная точность:
64 бита для представления числа, из которых 53 бита предназначены для мантиссы. Следуя тому же рассуждению, выражение 2^(-53) как степени 10 приводит к 10^(-15,95), что означает, что по крайней мере 15 десятичных знаков всегда будут правильными.
Есть макросы для количества десятичных разрядов, которые поддерживает каждый тип. Документы gcc объясняют, что они из себя представляют, а также что они имеют в виду:
FLT_DIG
Это количество десятичных цифр точности для типа данных с плавающей запятой. Технически, если p и b являются точностью и основанием (соответственно) для представления, то десятичная точность q является максимальным числом десятичных цифр, так что любое число с плавающей запятой с q основанием 10 цифр может быть округлено до числа с плавающей запятой с p base b цифры и обратно, без изменения до q десятичных цифр.
Предполагается, что значение этого макроса должно быть не менее 6, чтобы соответствовать ISO C.
DBL_DIG
LDBL_DIGОни похожи на FLT_DIG, но для типов данных double и long double соответственно. Значения этих макросов должны быть не менее 10.
И на gcc 4.9.2, и на clang 3.5.0 эти макросы дают 6 и 15 соответственно.
эти числа - количество поддерживаемых десятичных знаков или общее количество цифр в числе?
Они являются значащими цифрами, содержащимися в каждом номере (хотя они могут вам и не понадобиться, но они все еще там). Мантисса одного и того же типа всегда содержит одинаковое количество битов, поэтому каждое число последовательно содержит одинаковое количество действительных "цифр", если вы думаете в терминах десятичных цифр. Вы не можете хранить больше цифр, чем поместится в мантиссе.
Количество "поддерживаемых" цифр, однако, намного больше, например float
будет обычно поддерживать до 38 десятичных цифр и double
будет поддерживать до 308 десятичных цифр, но большинство из этих цифр не являются значимыми (то есть "неизвестно").
Хотя технически это неправильно, так как float
а также double
не имеют универсально четко определенных размеров, как я предполагал выше (они определяются реализацией). Кроме того, размеры хранилища не обязательно совпадают с размерами промежуточных результатов.
Стандарт C++ очень неохотно определяет точное фундаментальное значение, оставляя практически все для реализации. Типы с плавающей точкой не являются исключением:
3.9.1 / 8
Существует три типа с плавающей точкой: float, double и long double. Тип double обеспечивает, по крайней мере, такую же точность, как и float, а тип long double обеспечивает, по крайней мере, такую же точность, что и double. Набор значений типа float является подмножеством набора значений типа double; набор значений типа double является подмножеством набора значений типа long double. Представление значений типов с плавающей запятой определяется реализацией.
Теперь, конечно, все это не особенно полезно на практике.
На практике с плавающей запятой (обычно) IEEE 754 соответствует float
имеющий ширину 32 бита и double
имеющая ширину 64 бита (как хранится в памяти, регистры имеют более высокую точность на некоторых известных основных архитектурах).
Это эквивалентно 24 битам и 53 битам матиссы соответственно или 7 и 15 полным десятичным знакам.