Проблема, которую я пытаюсь как понять, так и решить, относится к той, которая была задана несколько лет назад в этом вопросе: Сумма двух "np.longdouble" дает большую числовую ошибку , но не связана с простой печать значений.
Предположим, что в простой библиотеке Python мы создаем два длинных типа double, как показано ниже:
a = np.longdouble('4')
b = np.longdouble('1e-3000')
Как и ожидалось, если проверять type(a)
или type(b)
, в результате оба типа numpy.float128
.
Что я хочу сделать, это просто сложить значения, хранящиеся в a
и b
, но просто сложив их, получим число 4:
In [3]: a + b
Out[3]: 4.0
In [4]: (a + b) == np.longdouble(4)
Out[4]: True
In [5]: (a + b) == np.longdouble('4')
Out[5]: True
In [6]: (a + b) == np.longdouble('4.0')
Out[6]: True
In [7]: (a + b) > np.longdouble('4.0')
Out[7]: False
In [8]: np.equal(a + b,np.longdouble('4.0'))
Out[8]: True
In [9]: np.greater(a + b,np.longdouble('4.0'))
Out[9]: False
In [10]: type(a + b)
Out[10]: numpy.float128
Как я полагаю, приведенные выше тесты подразумевают, что сумма между a
и b
свернута и фактически равна 4, независимо от того, какая сумма все еще сохраняется в объекте float128.
Обратите внимание, что то же самое не происходит с умножением или делением:
In [11]: a * b
Out[11]: 4e-300
In [12]: a / b
Out[12]: 4e+300
In [13]: b / a
Out[13]: 2.5e-301
Хотя то же самое происходит с вычитанием:
In [14]: np.equal(a - b,np.longdouble('4.0'))
Out[14]: True
In [15]: np.equal(b - a,np.longdouble('-4.0'))
Out[15]: True
In [16]: (a - b) == np.longdouble('4.0')
Out[16]: True
In [17]: (b - a) == np.longdouble('-4.0')
Out[17]: True
Следовательно, мои вопросы: почему суммирования и вычитания не работают должным образом и как я могу получить a + b
в приведенных выше примерах, получим число:
4.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
То есть в числе, чье логическое сравнение на равенство с числом 4 приводит к False
.
Obs: в случае, если это имеет какое-либо значение:
In [18]: np.nextafter(np.longdouble(0),1)
Out[18]: 4e-4951