ошибка при входе в Python - PullRequest
       10

ошибка при входе в Python

0 голосов
/ 13 июня 2009

111111111111111111111111111111111111111111111111111111111111

когда я беру это как ввод, он добавляет L в конце, как это

111111111111111111111111111111111111111111111111111111111111L

таким образом влияя на мои расчеты на нем .. как я могу удалить его?

import math
t=raw_input()
l1=[]
a=0
while (str(t)!="" and int(t)!= 0):
    l=1
    k=int(t)
    while(k!= 1):
        l=l+1
        a=(0.5 + 2.5*(k %2))*k + k % 2
        k=a

    l1.append(l)
    t=raw_input()
    a=a+1


for i in range(0,int(a)):
    print l1[i]

это мой код, и он работает для каждого теста, кроме 11111111111111111111111111111111111111111111111111111111111111111111111111

так что я думаю, что-то не так, когда python считает такое огромное число

Ответы [ 5 ]

3 голосов
/ 13 июня 2009

Похоже, здесь происходят две разные вещи. Во-первых, как отмечали другие авторы, суффикс L просто указывает, что Python преобразовал входное значение в длинное целое число. Вторая проблема на этой линии:

a=(0.5 + 2.5*(k %2))*k + k % 2

Это неявно приводит к числу с плавающей запятой для значения (0.5 + 2.5*(k %2))*k. Поскольку значения с плавающей точкой имеют только 53 бита, результат является неправильным из-за округления. Попробуйте рефакторинг строки, чтобы избежать математики с плавающей точкой, например:

a=(1 + 5*(k %2))*k//2 + k % 2
3 голосов
/ 13 июня 2009

Это вводится как длинное целое число, которое должно вести себя так же, как и любое другое число в плане выполнения вычислений. Только когда вы отображаете его, используя repr (или что-то, что вызывает repr, например, печать списка), он получает 'L'.

Что именно идет не так?

Редактировать : Спасибо за код. Насколько я вижу, длинное или короткое число не имеет значения, но не совсем понятно, что он должен делать.

2 голосов
/ 14 июня 2009

Другой способ избежать числовых ошибок в python - использовать тип Decimal вместо стандартного числа с плавающей точкой.

Пожалуйста, обратитесь к официальные документы

2 голосов
/ 13 июня 2009

Как заметил Ричи Хиндл в своем ответе, он представляется как длинное целое число. Вы можете прочитать о различных способах представления чисел в Python на следующей странице page .

Когда я использую такие большие числа в Python, я вижу букву L в конце числа. Это не должно влиять на вычисления, выполненные для числа. Например:

>>> a = 111111111111111111111111111111111111111
>>> a + 1
111111111111111111111111111111111111112L
>>> str(a)
'111111111111111111111111111111111111111'
>>> int(a)
111111111111111111111111111111111111111L

Я сделал это в командной строке python. Когда вы выводите число, оно будет иметь внутреннее представление числа, но оно не должно влиять на ваши вычисления. Ссылка, на которую я ссылаюсь выше, указывает, что длинные целые числа имеют неограниченную точность . Так круто!

0 голосов
/ 13 июня 2009

Вы уверены, что L действительно является частью этого? Когда вы печатаете такие большие числа, Python добавит L, чтобы указать, что это длинный целочисленный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...