gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:19 24 4
gpt4 key购买 nike

早上好

我正在从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com