Python почему 10e26! = 10 ** 26?(Неточность с плавающей точкой?) - PullRequest
0 голосов
/ 24 января 2019

Я пытался обработать некоторые довольно большие числа в python и столкнулся с ошибкой переполнения.Я решил исследовать немного больше и столкнулся с неравенством, которое я не могу объяснить.Когда я оцениваю 10 ^ 26, я получаю:

>>> 10**26
100000000000000000000000000

Что вполне логично.Однако когда я вычисляю 10e26 и конвертирую его в int, я получаю:

>>>int(10e26)
1000000000000000013287555072

Почему это так?Я правильно не понимаю электронную нотацию?(Из того, что я знаю, 10e26 - это 10 * 10 ^ 26, как видно из этого ответа: 10e нотация, используемая с переменными? )

10 ^ 26 намного превышает максимальный целочисленный размер, поэтому я былТакже интересно, есть ли в Python какой-либо механизм, который позволял бы работать с числами в научном формате (не считая всех этих нулей), чтобы можно было вычислять операции с числами после максимального размера.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

10e26 соответствует десятикратному десятичному числу 26, что составляет 10 27 .

10**26 представляет собой десять в степени 26, 10 26 .

Очевидно, что они разные, поэтому 10e26 == 10**26 неверно.

Однако, если мы исправим ошибку и сравним 1e26 и 10**26, оценив 1e26 == 10**26, мы получим false по другой причине:

  • 1e26 вычисляется в формате с плавающей запятой ограниченной точности, в большинстве случаев получая 100000000000000004764729344. (Python не является строгим в отношении формата с плавающей запятой.) 100000000000000004764729344 - самое близкое, которое можно получить до 10 26 , используя 53 значащих бита.
  • 10**26 вычисляется с помощью целочисленной арифметики, получая 100000000000000000000000000.
  • Сравнивая их отчеты, они отличаются.

(Я не уверен в семантике Python, но я предполагаю, что она преобразует значение с плавающей запятой в целое число с расширенной точностью для сравнения. Если вместо этого мы преобразуем целое число в число с плавающей запятой, с float(10**26) == 1e26, преобразование От 100000000000000000000000000 до float дает то же значение, 100000000000000004764729344, и сравнение возвращает значение true.)

0 голосов
/ 24 января 2019

Короткий ответ: 10e26 и 10**26 делают , а не представляют идентичные значения.

10**26, причем оба операнда имеют значения int, оценивается как int.Поскольку int представляет целые числа с произвольной точностью, его значение равно точно 10 26 , как и предполагалось.

10e26, с другой стороны, представляет собой float literal, и, следовательно, полученное значение зависит от ограниченной точности типа float на вашем компьютере.Результат int(10e26) является целочисленным значением float, ближайшим к действительному числу 10 27 .

...