Serious error in int() function?

Christian Gollwitzer auriocus at gmx.de
Thu Apr 14 03:25:38 EDT 2016


Am 14.04.16 um 08:52 schrieb ast:
> Is it sure that the square root of a square number is always
> an integer ?

Mathematically, yes.

> I would not like to get a result as 345.99999999
>
> from math import sqrt
>
>>>> sqrt(16)
> 4.0
>>>> sqrt(16).is_integer()
> True
>
>>>> for n in range(1000000):
> ...         if not sqrt(n**2).is_integer():
> ...             print(sqrt(n**2))
>
> it seems to work ... but does it work for all integers ?


No. sqrt uses floating point arithmetic, which in Python uses IEEE 64 
bit floating point math (the C double type). This has 53 bits of 
mantissa, that means if your square is larger than 2^53, and does not 
contain only powers of two in addition, the square root will be off.

But the good news is that there are integer square root algorithms. 
Since Python supports arbitrary large integers, you can use one of those.

An isqrt implementation wa discussed here recently:

https://groups.google.com/forum/#!topic/comp.lang.python/70D5yVj7mIY

	Christian



More information about the Python-list mailing list