техническая проблема на python с бесконечным поплавком - PullRequest
2 голосов
/ 10 марта 2020

Я использую Python, и у меня есть проблема, я хочу создать программу, которая может считать от 1 до бесконечности, чтобы знать, сколько это бесконечно. Вот мой код:

a=0
for i in range(1, 10e+99):
  a += 1
  print (a)

, но он говорит, что «объект с плавающей точкой не может быть интерпретирован как целое число»

, тогда как 10e + 99 не является числом с плавающей точкой, помогите мне, пожалуйста

Ответы [ 5 ]

1 голос
/ 10 марта 2020
  1. Согласно документации Python 2 и Python 3 документации , range требуются целочисленные аргументы.

  2. В 32-разрядном двоичном формате с плавающей точкой IEEE-754 наибольшее представимое конечное число составляет около 3.4028e38. При преобразовании чисел, таких как 1e99 в исходном коде, в этот формат любое число, большее или равное 2 128 -2 104 (340,282,377,062,143,265,289,209,819,405,393,854,464), будет преобразовано в бесконечность, предполагая, что используется общий метод округления до ближайших связей к четным. Из-за этого 10e+99 (что означает 10 • 10 99 и, следовательно, 10 100 ) будет действовать как бесконечность. Однако Python реализации чаще всего используют 64-битную двоичную с плавающей точкой IEEE-754, в которой наибольшее представимое конечное число равно 2 1024 -2 971 и 10e99 действует как конечное число. 1 Таким образом, чтобы получить бесконечность, вам потребуется около 1e309.

  3. По-человечески невозможно проверить, все ли oop увеличение на 1 от 1 до 10e99 приведет к бесконечности, потому что общая вычислительная мощность, доступная человеку, составляет всего около 10 30 добавок в год (для слабого ощущения «вокруг», некоторые порядки величины) , Этого недостаточно, чтобы сосчитать до предела 32-разрядных конечных чисел с плавающей запятой, не говоря уже о 64-разрядных числах с плавающей запятой.

  4. Если арифметические c были выполненный в формате с плавающей запятой, он никогда не достигнет бесконечности даже при неограниченной вычислительной мощности, потому что, как только сумма достигнет 2 53 в 64-битном двоичном коде IEEE-754, добавление 1 не изменит число; 2 53 будет производиться в каждой итерации. Это связано с тем, что 64-разрядный двоичный код IEEE-754 имеет только 53 бита, доступных для значений, поэтому 2 53 + 1 не может быть представлен. Ближайшие представимые значения: 2 53 и 2 53 + 2. Когда выполняется арифметика c, точный результат действительного числа по умолчанию округляется до ближайшего представимого значения, а связи округляются до числа с четным младшим битом в его значении. Когда 1 добавляется к 2 53 , результат действительного числа 2 53 + 1 округляется до 2 53 , и сумма, таким образом, остается равной 2 53 для всех итераций в будущем.

Сноска

1065 * 1 представляемое ближайшее значение 10 100 является 10.000.000.000.000.000.159.028.911.097.599.180.468.360.808.563.945.281.389.781.327.557.747.838.772.170.381.060.813.469.985.856.815.104.
0 голосов
/ 10 марта 2020

Вот что произойдет, если вы исправите и выполните свою программу:

a=0
for i in range(1, 10**100):
  a += 1
  print (a)

Предположим, у вас есть суперэффективная python виртуальная машина (все знают, насколько они эффективны ...).

Предположим, у вас очень эффективная реализация (неограниченных) больших целых чисел.

Предположим, что для каждого l oop требуется несколько машинных циклов для печати этих чисел в десятичной форме (скажем, только 1000, что в реальности).

Предположим, что каждый цикл занимает приблизительно 1,0e-10 с (10 ГГц), что означает реализацию печати с использованием преимуществ параллелизма.

С этой ирреалистической c гипотезой, это уже 10 ^ 93 с, необходимых для завершения программы.

Возраст вселенной, по оценкам, составляет менее 10 ^ 18 с. Whaouh! Это будет долго.

Теперь давайте посчитаем энергию, которую он потребляет на базе компьютера мощностью 400 Вт. Предполагая, что вся материя Солнца (2e30 кг) может быть преобразована в электроэнергию для вашего компьютера (через E = mc ^ 2), вы собираетесь потратить около 2 10 ^ 48 эквивалента Солнца для выполнения этого вычисления.

Прежде чем нажать «вернуться», я прошу вас: подумайте дважды! Спаси вселенную!

0 голосов
/ 10 марта 2020

С помощью кода вы можете проверить, является ли ваша переменная бесконечностью или нет.

import math

infinity = float('inf')
a = 99999999999999999999999999999999
if a > infinity:
 print('Your number is an infinity number')
else:
 print('Your number is not an infinity number')

#or you can check with math.isinf

print('Your number is Infinity: ',math.isinf(infinity ))

# Also infinity can be both positive and negative 

Примечание: бесконечность - это бесконечность, которая не имеет конца, независимо от того, какое значение вы вводите или вводите, она всегда возвращает false.

0 голосов
/ 10 марта 2020

Проблема возникает потому, что функция range() принимает int, тогда как 10e + 99 действительно float. Хотя 10e + 99, конечно, не бесконечность, и поэтому вы не должны ожидать, что бесконечность появится где-нибудь во время выполнения вашей программы, если вы действительно хотите, чтобы l oop работал как есть Вы могли бы просто сделать

a=0
for i in range(1, int(10e+99)):
    a += 1
    print (a)

Как отмечали другие пользователи, я бы, однако, полностью переосмыслил вашу стратегию: используя диапазон на основе l oop, чтобы "выяснить" значение бесконечности просто не работает Бесконечность - это не число.

0 голосов
/ 10 марта 2020

Возможно, вы имели в виду, что ваша программа go навсегда:

a = 0
while True:
  a += 1
  print(a)

В моей голове, когда я вижу while True:, я заменяю ее на 'навсегда'.

...