I have been playing C99's quad precision long double. It is my understanding that (platform specific) numpy supports long double and 128bit floats.
I have run across something I cannot explain however.
Given:
>>> import numpy as np
Calculate a number that will require more than 64 bits but less than 128 bits to represent as an integer:
>>> 2**64+2
18446744073709551618 # note the '8' at the end
>>> int(2**64+2)
18446744073709551618 # same obviously
If I calculate the same number in C99 128 bit long double, I get 18446744073709551618.000000
Now, if I use numpy long double:
>>> a=np.longdouble(2)
>>> b=np.longdouble(64)
>>> a**b+a
18446744073709551618.0 # all good...
What about these incorrect results:
>>> np.longdouble(2**64+2)
18446744073709551616.0 # Note '6'; appears 2**64 not done in long double
>>> np.longdouble(int(2**64+2))
18446744073709551616.0 # can't force the use of a Python long
>>> n=int(2**64+2)
>>> np.longdouble(n)
18446744073709551616.0
>>> np.longdouble(18446744073709551618)
18446744073709551616.0 # It really does not want to do '8' at the end
But, this works:
>>> np.longdouble(2**64)+2
18446744073709551618.0
Question: Does numpy have issues converting values correctly into long doubles? Is there something I am doing incorrect?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…