Я играл в C99 quad precision long double. Я понимаю, что (определенная платформа) numpy поддерживает длинный двойной и 128-битные поплавки.
Я столкнулся с чем-то, что не могу объяснить.
Дано:
>>> import numpy as np
Вычислите число, для которого требуется более 64 бит, но менее 128 бит для представления в виде целого числа:
>>> 2**64+2
18446744073709551618 # note the '8' at the end
>>> int(2**64+2)
18446744073709551618 # same obviously
Если я рассчитать тот же номер в C99 128 бит длинный двойной, я получаю 18446744073709551618.000000
Теперь, если я использую numpy long double:
>>> a=np.longdouble(2)
>>> b=np.longdouble(64)
>>> a**b+a
18446744073709551618.0 # all good...
Как насчет этих неправильных результатов:
>>> 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
Но это работает:
>>> np.longdouble(2**64)+2
18446744073709551618.0
Вопрос: Имеет ли numpy проблемы, которые правильно преобразуют значения в длинные удвоения? Есть ли что-то, что я делаю неправильно?