Подтвердить что ты не робот

Сколько десятичных знаков делает примитивную поплавку и двойную поддержку?

Я прочитал, что double хранит 15 цифр, а float хранит 7 цифр.

Мой вопрос в том, поддерживают ли эти числа число поддерживаемых десятичных знаков или общее количество цифр в числе?

4b9b3361

Ответ 1

Это общее количество "значимых цифр", если вы хотите, считая слева направо, независимо от того, где находится десятичная точка. Помимо этих цифр цифры точность не сохраняется.

Подсчеты, которые вы указали, предназначены для представления базы 10.

Ответ 2

Существуют макросы для количества десятичных знаков, поддерживаемых каждым типом. gcc docs объясняют, что они собой представляют, и что они означают:

FLT_DIG

Это число десятичных цифр точности для типа данных с плавающей точкой. Технически, если p и b являются точностью и базой (соответственно) для представления, то десятичная точность q является максимальным числом десятичных цифр, так что любое число с плавающей запятой с q base 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 соответственно.

Ответ 3

- эти числа поддерживают число десятичных знаков или общее количество цифр в числе?

Это значащие цифры, содержащиеся в каждом номере (хотя вам могут и не нужны все, но они все еще там). Мантисса того же типа всегда содержит одинаковое количество бит, поэтому каждое число, следовательно, содержит одинаковое количество действительных "цифр", если вы думаете о десятичных цифрах. Вы не можете хранить больше цифр, чем вписывается в мантиссу.

Число "поддерживаемых" цифр, однако, намного больше, например float обычно поддерживает до 38 десятичных цифр, а double будет поддерживать до 308 десятичных цифр, но большинство этих цифр не являются значимыми (то есть, "неизвестно" ).

Хотя это технически, это неправильно, поскольку float и double не имеют универсально определенных размеров, как я предполагал выше (они определены в реализации). Кроме того, размеры хранилища не обязательно совпадают с размерами промежуточных результатов.

Стандарт С++ очень неохотно определяет точный фундаментальный тип, оставляя почти все для реализации. Тип плавающей точки не является исключением:

3.9.1/8
Существует три типа с плавающей запятой: float, double и long double. Тип double обеспечивает как минимум такую ​​же точность, как float, а double double double обеспечивает как минимум такую ​​же точность, как double. Набор значений типа float является подмножеством набора значений типа double; набор значений типа double является подмножеством набора значений типа long double. Представление значений типов с плавающей запятой определяется реализацией.

Теперь, конечно, все это не очень полезно на практике.

На практике плавающая точка (обычно) соответствует IEEE 754, причем float имеет ширину 32 бита и double, имеющую ширину в 64 бита (как хранится в памяти, регистры имеют более высокую точность на некоторых заметных основных направлениях архитектуры).

Это эквивалентно 24 бит и 53 бит матиссы соответственно или 7 и 15 полных десятичных знаков.

Ответ 4

Если вы используете архитектуру с использованием арифметики с плавающей запятой 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 десятичных знаков будут всегда правильно.