Hick
Hick

Reputation: 36394

an error in taking an input in python

111111111111111111111111111111111111111111111111111111111111

when i take this as input , it appends an L at the end like this

111111111111111111111111111111111111111111111111111111111111L

thus affecting my calculations on it .. how can i remove it?

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]

this is my code and it works for every test case except 111111111111111111111111111111111111111111111111111111111111

so i guess something is wrong when python considers such a huge number

Upvotes: 0

Views: 849

Answers (5)

ymir
ymir

Reputation: 295

Another way to avoid numerical errors in python is to use Decimal type instead of standard float.

Please refer to official docs

Upvotes: 2

Theran
Theran

Reputation: 3856

It looks like there are two distinct things happening here. First, as the other posters have noted, the L suffix simply indicates that Python has converted the input value to a long integer. The second issue is on this line:

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

This implicitly results in a floating point number for the value of (0.5 + 2.5*(k %2))*k. Since floats only have 53 bits of precision the result is incorrect due to rounding. Try refactoring the line to avoid floating point math, like this:

a=(1 + 5*(k %2))*k//2 + k % 2

Upvotes: 3

RichieHindle
RichieHindle

Reputation: 281395

It's being input as a Long Integer, which should behave just like any other number in terms of doing calculations. It's only when you display it using repr (or something that invokes repr, like printing a list) that it gets the 'L'.

What exactly is going wrong?

Edit: Thanks for the code. As far as I can see, giving it a long or short number makes no difference, but it's not really clear what it's supposed to do.

Upvotes: 3

Dan Wolchonok
Dan Wolchonok

Reputation: 1940

As RichieHindle noticed in his answer, it is being represented as a Long Integer. You can read about the different ways that numbers can be represented in Python at the following page.

When I use numbers that large in Python, I see the L at the end of the number as well. It shouldn't affect any of the computations done on the number. For example:

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

I did that on the python command line. When you output the number, it will have the internal representation for the number, but it shouldn't affect any of your computations. The link I reference above specifies that long integers have unlimited precision. So cool!

Upvotes: 2

Sander Marechal
Sander Marechal

Reputation: 23216

Are you sure that L is really part of it? When you print such large numbers, Python will append an L to indicate it's a long integer object.

Upvotes: 0

Related Questions