python - 两个 "np.longdouble"的总和产生很大的数值错误

标签 python numpy long-double

早上好

我正在从 FITS 文件中读取两个数字(代表单个数字的整数和浮点部分),将它们转换为长 double (在我的机器中为 128 位),然后将它们相加。

结果不如我对使用 128 位 float 的预期精确。这是代码:

a_int = np.longdouble(read_header_key(fits_file, 'I'))
print "I %.25f" % a_int, type(a_int)
a_float = np.longdouble(read_header_key(fits_file, 'F'))
print "F %.25f" % a_float, a_float.dtype
a = a_int + a_float
print "TOT %.25f" % a, a.dtype

这是我得到的答案:

I 55197.0000000000000000000000000 <type 'numpy.float128'>
F 0.0007660185200000000195833 float128
TOT 55197.0007660185219720005989075 float128

结果仅在 11 位十进制数字(总共 16 位有效数字)之后偏离了我的预期 (55197.0007660185200000000195833)。我希望 128 位 float 有更好的精度。我究竟做错了什么?

此结果在 Mac 机器和 Linux 32 位机器上重现(在那种情况下,dtype 是 float96,但值完全相同)

预先感谢您的帮助!

马特奥

最佳答案

问题在于您打印了 np.longdouble。当您使用 %f 进行格式化时,Python 会在打印前将结果转换为 float (64 位)。

这里:

>>> a_int = np.longdouble(55197)
>>> a_float = np.longdouble(76601852) / 10**11
>>> b = a_int + a_float
>>> '%.25f' % b
'55197.0007660185219720005989075'
>>> '%.25f' % float(b)
'55197.0007660185219720005989075'
>>> b * 10**18
5.5197000766018519998e+22

请注意,在我的机器上,与普通的 double 相比,我使用 longdouble 只获得了一点精度(小数点后 20 位而不是 15 位)。因此,可能值得看看 Decimal 模块是否更适合您的应用程序。 Decimal 处理任意精度的十进制 float 而不损失精度。

关于python - 两个 "np.longdouble"的总和产生很大的数值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14876165/

相关文章:

python - 矩阵的xy坐标列表

c - 什么比长双倍更大?

Linux 错误上的 Python 3.6 tkinter 窗口图标

python - arcgis 联合 python 错误

python - 从 python 子进程模块启动模块 shell 命令

Python:将 numpy Flip 与 memmap 结合使用

python - 不支持身份验证插件 'caching_sha2_password'

python - 如何通过xlwings包导入numpy? "ImportError: DLL load failed: The specified module could not be found."

我可以在c语言中使用long double来计算整数吗

c++ - 想计算 18 位数字但只会计算到 6 位?使用 long double 但仍然无法正常工作