Serious error in int() function?

blindanagram at nowhere.net blindanagram at nowhere.net
Fri Apr 15 04:41:19 EDT 2016


On 15/04/2016 01:36, Dennis Lee Bieber wrote:
> On Thu, 14 Apr 2016 13:07:03 +0100, blindanagram at nowhere.net declaimed the
> following:
> 
>> On 14/04/2016 09:13, blindanagram at nowhere.net wrote:
>>> On 14/04/2016 08:59, blindanagram at nowhere.net wrote:
>>>> On 14/04/2016 07:52, ast wrote:
>>>
>>>> This means that the result will be correct provided it has 53 or less
>>>> bits - just short of 16 decimal digits (i.e for square numbers with less
>>>> than 32 digits).
>>>>
>>>> With an integer square root function (isqrt), this program:
>>>>
>>>> for exp in count(20):
>>>>   v = 2 ** exp - 1
>>>>   if isqrt(v) != sqrt(v):
>>>>     print(exp, isqrt(v), sqrt(v))
>>>>     break
>>>>
>>>> terminates with:
>>>>
>>>>   54 18014398509481983 1.8014398509481982e+16
>>>>
>>>> showing a first error for a 54 bit square root
>>>>
>>> I should also have said that the square root of integer squares with
>>> between 15 and 30 decimal digits will only be correct if the square
>>> numbers themselves are exactly representable in 53 bits.  So we can
>>> expect failures for squares with 16 or more digits.
>>
>> However, if a number with 31 or less digits is known to be the square of
>> an integer, the IEEE754 sqrt function will (I believe) give the correct
>> result.
> 
> 	How could it EXCEPT by having ~15 significant digits and an exponent --
> since that is all the data that is provided by a double precision floating
> point. 

It can have up to about 30 significant digits because we know thaat it
is the square of a an integer that is representable in IEEE754 floating
point.

So when we consider its square root we only have to consider the squares
of integers that are representable and find the one that is 'nearest' to
our 30 bit integer.

When x is a representable integer the gap between (x- 1)^2, x^2 and (x +
1)^2 is approximately 2 * x and this means that ~30 digit perfect
squares will have different floating point representations because they
differ by a 15 digit value and will hence differ in their first ~15
significant digits.




More information about the Python-list mailing list