Почему sys.maxint <(sys.maxint - 100 + 0,01) в Python? - PullRequest
7 голосов
/ 25 марта 2011

Почему sys.maxint <(sys.maxint - 100 + 0,01) в Python? </p>

Ответы [ 3 ]

12 голосов
/ 25 марта 2011

Вероятно, это связано с потерей точности при очень больших значениях с плавающей запятой. (добавление 0.01 преобразует правую часть в число с плавающей точкой).

Редактировать: Я пытался дать точное объяснение того, что здесь происходит, но безрезультатно. Поэтому я отправил вопрос об этом.

3 голосов
/ 25 марта 2011

В системе с 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, но это интересное любопытство языка.

3 голосов
/ 25 марта 2011

по крайней мере, на моей машине это не

In [7]: import sys

In [8]: sys.maxint < (sys.maxint - 100 + 0.01)
Out[8]: False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...