Вы можете использовать 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)]
Это природа математики конечной точности. Если вы попытаетесь сохранить значение, которое не может быть представлено точно, в лучшем случае вы получите наиболее близкое представимое значение.
Посмотрите на двоичный файл:
999900032 -> 111011100110010100001110000000
999900000 -> 11101110011001010000110 11 00000
Таким образом, представление этого числа будет требуют двух дополнительных битов точности. Предположительно, это больше, чем float
обеспечивает в вашей системе.
В общей настольной реализации float
, стандарта IEEE 754 имеется только 24 значащих и битных (и 8 экспоненциальных битов). Это означает, что самое большое последовательное значение, которое может быть представлено без потери точности, равно 2 24 sup>, что приблизительно равно 1,6E7 (1,6 • 10 7 sup>). Например, нечетное значение выше этого порога не может быть точно представлено таким float
, так как младшее значащее 1-битное значение «падает» в представлении.
Ваше значение составляет приблизительно 1E9 (10 9 sup>), что в 60 раз больше. Это означает, что значение может быть около 30 от (после округления до ближайшего представимого значения). Обратите внимание, что биты экспоненты дают 2 exp sup> (без прыщей о смещении), а не 10 exp sup>.
С double
есть 53 бита, которых более чем достаточно для 1E9 (10 9 sup>).