печать с плавающей точкой имеет неожиданное значение [дубликат]

Вы можете использовать re.finditer() для совпадающих совпадений.

>>> import re
>>> aString = 'this is a string where the substring "is" is repeated several times'
>>> print [(a.start(), a.end()) for a in list(re.finditer('is', aString))]
[(2, 4), (5, 7), (38, 40), (42, 44)]

, но не будет работать:

In [1]: aString="ababa"

In [2]: print [(a.start(), a.end()) for a in list(re.finditer('aba', aString))]
Output: [(0, 3)]
-3
задан hanlonj 17 January 2019 в 04:52
поделиться

2 ответа

Это природа математики конечной точности. Если вы попытаетесь сохранить значение, которое не может быть представлено точно, в лучшем случае вы получите наиболее близкое представимое значение.

Посмотрите на двоичный файл:
999900032 -> 111011100110010100001110000000
999900000 -> 11101110011001010000110 11 00000

Таким образом, представление этого числа будет требуют двух дополнительных битов точности. Предположительно, это больше, чем float обеспечивает в вашей системе.

0
ответ дан David Schwartz 17 January 2019 в 04:52
поделиться

В общей настольной реализации float, стандарта IEEE 754 имеется только 24 значащих и битных (и 8 экспоненциальных битов). Это означает, что самое большое последовательное значение, которое может быть представлено без потери точности, равно 2 24 , что приблизительно равно 1,6E7 (1,6 • 10 7 ). Например, нечетное значение выше этого порога не может быть точно представлено таким float, так как младшее значащее 1-битное значение «падает» в представлении.

Ваше значение составляет приблизительно 1E9 (10 9 ), что в 60 раз больше. Это означает, что значение может быть около 30 от (после округления до ближайшего представимого значения). Обратите внимание, что биты экспоненты дают 2 exp (без прыщей о смещении), а не 10 exp .

С double есть 53 бита, которых более чем достаточно для 1E9 (10 9 ).

0
ответ дан Michael Veksler 17 January 2019 в 04:52
поделиться
Другие вопросы по тегам:

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