Как сложение / вычитание чисел с плавающей точкой работает в Python? - PullRequest
0 голосов
/ 06 ноября 2011

Я не понимаю, что происходит в следующих строках кода:

>>> 123456789012345678. -123456789012345677.
0.0

Разве результат не должен быть 1,0?

Спасибо. Приветствия:)

Ответы [ 4 ]

7 голосов
/ 06 ноября 2011

Float хранит только 53 бита информации, поэтому на вас влияет округление.

Вместо этого используйте целые числа:

>>> 123456789012345678 - 123456789012345677
1

Или используйте десятичный модуль:

>>> from decimal import Decimal
>>> Decimal('123456789012345678.0') - Decimal('123456789012345677.0')
Decimal('1.0')
3 голосов
/ 06 ноября 2011

Числа с плавающей запятой хранятся в виде 53 битов 1 мантиссы, плюс 11 битов экспоненты и знакового бита.enter image description here

Для представления ваших чисел требуется более 53 битов, поэтому используется ближайшее действительное представимое значение с плавающей запятой.

Числа с плавающей запятой обычно моделируют реальные измерения или моделирование реальныхмировые системы.Немногие, если известны какие-либо физические константы или измерения с точностью, близкой к 52 битам, так что обычно это нормально.


1.Бит 53 rd - это скрытый бит , но вам недостаточно помочь:
$ dc
2 52 ^ p
4503599627370496
253 ^ р
9007199254740992
123456789012345678 <<<< ваш номер больше, на самом деле, он требует около 56 бит: <br>2о 2 53 ^ 1-р
11111111111111111111111111111111111111111111111111111
123456789012345678p
110110110100110110100101110100110001100001111001101001110

3 голосов
/ 06 ноября 2011

Нет точного представления 123456789012345678 в виде числа с плавающей запятой:

>>> 123456789012345678.
1.2345678901234568e+17
                 ^ oops
1 голос
/ 06 ноября 2011

У арифметики с плавающей точкой есть общая проблема с округлением.

Что должен знать каждый компьютерный специалист об арифметике с плавающей точкой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...