В системе с 64-битными значениями sys.maxint
равно:
// decimal hexadecimal
9223372036854775807 0x7fffffffffffffff
То есть sys.maxint - 100
это:
9223372036854775707 0x7fffffffffffff9b
При добавлении 0.01
перед добавлением это значение округляется до плавающей запятой двойной точности. Два ближайших значения, которые могут быть представлены с двойной точностью:
9223372036854774784 0x7ffffffffffffc00
9223372036854775808 0x8000000000000000
Поскольку sys.maxint - 100
ближе ко второму (большему) значению, оно округляется вверх. Добавление 0.01
дает:
9223372036854775808.01 0x8000000000000000.028f5c28f5c...
, который не представлен в двойной точности, поэтому он снова округляется до:
9223372036854775808 0x8000000000000000
Таким образом, значение sys.maxint - 100 + 0.01
на фактически больше значения sys.maxint
. Однако во многих современных языках сравнение между целым числом и числом с плавающей запятой вынуждает целочисленное значение преобразовываться в число с плавающей запятой до того, как сравнение будет выполнено; если бы это было в случае с Python, sys.maxint
было бы округлено до того же значения, и они сравнивались бы равными. Кажется, что это не так в Python. Я не знаком с деталями чисел Python, но это интересное любопытство языка.