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