LINUX.ORG.RU

0.1 + 0.2 != 0.3 (IEEE 754). Непонятки

 


0

1

На примере JavaScript результат сложения: 0.30000000000000004

Я считаю так! Перевод 0.1 в 2СС: 0.00011001100110011001100110011001100110011001100110011010 Перевод 0.2 в 2СС: 0.0011001100110011001100110011001100110011001100110011010

Ну или проще говоря: (7205759403792794 / 2^56) + (7205759403792794 / 2^55) = 0.3000000000000000167

Почему не совпадают числа ?

Перемещено jollheef из science


Ответ на: комментарий от i-rinat

Это и так понятно!

Хорошо, спрошу по другому: как мне сложить эти два числа чтобы получился ответ 0.30000000000000004? Про неточность вычисления я понял.

Почему я насчитал 0.3000000000000000167?

KRex
() автор топика
Ответ на: Это и так понятно! от KRex

Почему я насчитал 0.3000000000000000167?

Ты насчитал правильно. Но такого числа нет, есть только ≈0.299999999999999988897769753748 и ≈0.300000000000000044408920985006. Последнее чуточку ближе к тому, что ты насчитал.

i-rinat ★★★★★
()
Ответ на: А откуда такая логика? от KRex

А откуда такая логика?

С потолка.

Если тебе не лень вчитаться в стандарт, и ты уже даже начал, может просто найдёшь там описание процедуры сложения и протрассируешь по шагам на конкретном примере?

i-rinat ★★★★★
()

Тут трабла в представлении чисел с плавающей точкой внутри компов в двоичном виде.

Так просто есть и всё.

Почитай про хранение таких чисел в двоичном виде и про их распределение на прямой. Чем ближе к нолю - тем плотность больше, чем дальше от ноля - тем меньше.

Вообще эти числа с плавающей запятой весьма не хилый «подарочек» даже для осведомлённых.

Serg_HIS
()

К стати для таких случаев в некоторых языках есть тип Decimal (десятиный) и даже в процессорах семейства x86 есть вариант хранения десятичных чисел по 4 бита на цифру и операции с ними.

Serg_HIS
()
Ответ на: комментарий от t184256

Decimal специально для этого и разработан. Там десятки нюансов учтено при разработке.

Serg_HIS
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.