Как изобразить 0,1 в арифметике с плавающей запятой и десятичной

Я пытаюсь лучше понять арифметику с плавающей запятой и видел несколько ссылок на «Что должен знать каждый компьютерный специалист об арифметике с плавающей запятой».

Я до сих пор не понимаю, как число типа 0,1 или 0,5 хранится в числах с плавающей запятой и в десятичных числах.

Может кто-нибудь объяснить, как устроена память?

Я знаю, что число с плавающей запятой равно двум части (т. е. число в степени чего-либо).

11
задан paxdiablo 24 February 2017 в 14:09
поделиться

2 ответа

Я всегда указывал людям на онлайн-конвертер Харальда Шмидта , а также на статью Wikipedia IEEE754-1985 с красивыми картинками.

Для этих двух конкретных значений вы получите (для 0,1):

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm    1/n
0 01111011 10011001100110011001101
           |  ||  ||  ||  ||  || +- 8388608
           |  ||  ||  ||  ||  |+--- 2097152
           |  ||  ||  ||  ||  +---- 1048576
           |  ||  ||  ||  |+-------  131072
           |  ||  ||  ||  +--------   65536
           |  ||  ||  |+-----------    8192
           |  ||  ||  +------------    4096
           |  ||  |+---------------     512
           |  ||  +----------------     256
           |  |+-------------------      32
           |  +--------------------      16
           +-----------------------       2

Знак положительный, это довольно просто.

Показатель степени 64 + 32 + 16 + 8 + 2 + 1 = 123–127 смещение = -4 , поэтому множитель равен 2 -4 или 1/16 .

Мантисса коренастая. Он состоит из 1 (неявное основание) плюс (для всех этих битов, каждый из которых имеет значение 1 / (2 n ) как n ] начинается с 1 и увеличивается вправо), {1/2, 1/16, 1/32, 1/256, 1/512, 1/4096, 1/8192, 1 / 65536, 1/131072, 1/1048576, 1/2097152, 1/8388608} .

Сложив все это, вы получите 1,60000002384185791015625 .

Когда вы умножаете это на множитель, вы получаете 0,100000001490116119384765625 , поэтому они говорят, что вы не можете представить 0,1 в точности как число с плавающей запятой IEEE754, и предоставляет так много возможностей для SO для люди, отвечающие на «почему не 0,1 + 0,1 + 0,1 == 0,3?» вопросы типа: -)


Пример 0,5 существенно проще.Он представлен как:

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 00000000000000000000000

, что означает, что это неявное основание, 1 , плюс никаких других добавок (все биты мантиссы равны нулю).

Знак снова положительный. Показатель степени 64 + 32 + 16 + 8 + 4 + 2 = 126–127 смещение = -1 . Следовательно, множитель равен 2 -1 , что составляет 1/2 или 0,5 .

Таким образом, окончательное значение равно 1 , умноженному на 0,5 или 0,5 . Вуаля!


Иногда мне было легче думать об этом в десятичных терминах.

Число 1,345 эквивалентно

1 + 3/10   + 4/100 + 5/1000

или:

        -1       -2      -3
1 + 3*10   + 4*10  + 5*10

Аналогично, представление IEEE754 для десятичного числа 0,8125 :

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 10100000000000000000000

С неявным основанием 1, что эквивалентно двоичному:

         01111110-01111111
1.101 * 2

или:

                     -1
(1   + 1/2 + 1/8) * 2     (no 1/4 since that bit is 0)

, который становится:

(8/8 + 4/8 + 1/8) * 1/2

и , тогда становится:

13/8 * 1/2 = 0.8125
40
ответ дан 3 December 2019 в 01:20
поделиться

См. запись в Википедии и группу IEEE, во-первых.

В основном, есть знак, число и экспонента. Число в одном основании не может быть представлено конечным образом в другом основании, если исходное основание имеет коэффициенты, отсутствующие в конечном основании. Например, 1/3 не может быть представлена в виде конечного десятичного числа, но тривиально может быть представлена в виде троичного числа (основание 3): (0.1)3.

Таким образом, 0,5 имеет конечное двоичное представление, (0,1)2, то есть 2-1, но 0,1 имеет повторяющееся представление, потому что 2 и 10 не имеют общего множителя (5).

2
ответ дан 3 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: