早上好,
我从fits文件中读取两个数字(表示单个数字的整数和浮点部分),将它们转换为长双精度数(在我的机器中是128位),然后将它们相加。
结果并不像我期望的那样精确,因为使用128位浮点。代码如下:
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
结果偏离了我的预期(55197.0007660185200000000195833),只有11位小数(总共16位有效数字)我预计128位浮点运算的精度会更好我做错什么了?
此结果在Mac计算机和Linux 32位计算机上复制(在这种情况下,数据类型为float96,但值完全相同)
提前谢谢你的帮助!
马特奥
最佳答案
问题在于打印np.longdouble
当使用%f
格式化时,python会在打印之前将结果转换为浮点(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
请注意,在我的机器上,与普通的
longdouble
相比,double
的精度只提高了一点点(小数点后20位而不是15位)。因此,值得一看Decimal
模块是否更适合您的应用程序。Decimal
处理任意精度的十进制浮点数而不丢失精度。关于python - 两个“np.longdouble”之和产生很大的数值误差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14876165/