Как float гарантирует точность до 7 цифр? - PullRequest
0 голосов
/ 23 мая 2018

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

Я могу понять, что 7-значные целые числа соответствуют 23-битной мантиссе и непотеря точности, но не могу понять, как число типа 1234567000000000 помещается без свободных цифр «1,2,3,4,5,6,7», что за математика стоит за этим?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Базовый 32-битный двоичный формат IEEE-754 с плавающей запятой гарантирует только то, что шесть значащих десятичных цифр выдержат циклическое преобразование, а не семь.В частности: если вы преобразуете число, которое точно представлено шестью десятичными цифрами, умноженными на степень десять, в двоичный формат с использованием правильного округления до ближайшего округления, при этом переполнение или переполнение не происходит, а затем выполняется обратное преобразование в ближайшийчисло, представляемое шестью десятичными цифрами, умноженное на десять, результатом будет исходное число.

Как правило, когда десятичное число преобразуется в двоичную с плавающей точкой, результат может не совпадать с цифрами при записив десятичном.Ваш пример, 1234567000000000, преобразуется в 1234567008616448, но мы могли бы найти случай, когда 123456000… преобразуется в 123455900…, поэтому одна из исходных цифр отличается.Но точность, обеспечиваемая двоичным форматом, такова, что результат преобразования в двоичный формат всегда настолько близок к исходному значению, что разница никогда не превышает половины значения шестой цифры.Например, преобразование 123456000… всегда будет давать результат между 123455500… и 123456500… Поскольку результат первого преобразования всегда находится в пределах такого интервала, преобразование его обратно в шесть десятичных цифр с округлением всегда приводит к исходному числу.

Чтобы сделать эту гарантию, точность формата должна быть такой же высокой, как у одной части в 999999. Это потому, что тогда числа в двоичном формате настолько точно разнесены, что в интервале отОт 9999985… до 9999995…, поэтому результат преобразования из десятичной в двоичную форму может дать результат, достаточно близкий к исходному, чтобы обратное преобразование давало исходное значение.При значении 24 бита в значении (один подразумеваемый, 23 явных) точность составляет, по меньшей мере, одну часть в 2 23 , что составляет 8 388 608.(Значение может доходить до 16 777 215, но у нас нет выбора по этому поводу - он должен быть нормализован, что удерживает его в диапазоне от 8 388 608 до 16 777 215.)

Одна часть в 8 388 608 лучше, чем однав 999 999 можно гарантировать шесть цифр, но это не лучше, чем в 9 999 999, поэтому семь цифр не гарантируются.

0 голосов
/ 23 мая 2018

[Я] не могу понять, как число типа 1234567000000000 подходит без свободных цифр «1,2,3,4,5,6,7», что за математика стоит за этим?

Я не совсем понимаю твои рассуждения здесь.Как бы то ни было, вот как 1234567000000000 будет преобразовано в IEEE-754 binary32 (иначе. single , также известное как float в C):

1.09651577472686767578125 * 2**50

Экспонент применяется смещение (-127), мантисса и экспонента кодируются в базе 2, первый бит мантиссы отбрасывается, потому что он всегда 1.

Проверка https://babbage.cs.qc.cuny.edu/IEEE-754/ для себя

Как вы могли заметить, десятичное значение после преобразования в float не равно 1234567000000000, а примерно равно 1234567008616448, и вы увидите первые совпадения из 7 цифр.

Потеря точности происходит в менее значимых цифрах из-за ограниченного количества битов, используемых для кодирования мантиссы (также из-за преобразования в базу 2).

...