По каким стандартам Python анализируется строка с плавающей точкой? - PullRequest
3 голосов
/ 03 апреля 2019

Для относительно простых чисел, числовая точность достаточна для их точного представления. Например, 17,5 равно 17,5

Для более сложных операций с плавающей точкой, таких как

17.4999999999999982236431605997495353221893310546874 = 17.499999999999996447286321199499070644378662109375
17.4999999999999982236431605997495353221893310546875 = 17.5

Используя as_integer_ratio () для первого числа выше, можно получить (4925812092436479, 281474976710656), а поскольку (4925812092436479*2+1)/(2*281474976710656) равно второму числу выше, становится очевидным, что разбиение между> = 17.5 и <17.5 равно 1 / (2 * 281474976710656) . </p>

Гарантируют ли стандарты python, что конкретное значение с плавающей точкой будет "связано" с указанным выше конкретным бином, или это зависит от реализации? Если есть гарантия, как это решается?

Для вышеизложенного я использовал python 3.5.6, но меня интересует общий ответ для python 3.x, если он существует.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Для относительно простых чисел, числовая точность достаточна для их точного представления

Не совсем. Да, 17,5 можно представить именно потому, что оно кратно степени двух (точнее, 2 -1 ). Но даже очень простые поплавки типа 0.1 не могут быть точно представлены. Там это зависит от подпрограммы преобразования текста в float, чтобы получить представление, которое будет как можно ближе.

Преобразование выполняется средой выполнения (или средой выполнения C или Java компилятора для литералов), которая использует для этого функции C или Java (например, C strtod () ) (Java реализует код strtod () Дэвида Гея, но на языке Java).

Не каждая реализация strtod () , т.е. не каждый компилятор C / Java использует одну и ту же методологию для преобразования, поэтому могут быть небольшие, обычно незначительные различия в некоторые результаты .


FWIW, веб-сайт Исследование Binary (без принадлежности, я просто большой поклонник) имеет много статей на эту тему. Это явно не так просто, как ожидалось.

1 голос
/ 03 апреля 2019

Для относительно простых чисел с плавающей точкой достаточна числовая точность, чтобы точно представить их.

Нет, даже простые десятичные числа не обязательно имеют точное представление IEEE-754:

>>> format(0.1, '.20f')
'0.10000000000000000555'
>>> format(0.2, '.20f')
'0.20000000000000001110'
>>> format(0.3, '.20f')
'0.29999999999999998890'
>>> format(0.1 + 0.2, '.20f')
'0.30000000000000004441'

Полномочия 2 (x.0, x.5, x.25, x.125,…) являются точно представимыми, с точностью по модулю.

Гарантируют ли стандарты Python, что конкретное значение с плавающей точкой будет "связано" с указанным выше конкретным бином или это зависит от реализации?

Уверен, что Python просто делегирует базовую систему, поэтому он в основном зависит от оборудования. Если вы хотите гарантии, используйте decimal. Собственная реализация (C) IIRC была объединена в 3.3, и влияние использования десятичных разрядов на производительность стало намного, намного ниже, чем в Python 2.

0 голосов
/ 03 апреля 2019

Числа с плавающей точкой Python равны IEEE-754 удваивается .

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