- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
早上好
我正在从 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/
早上好 我正在从 FITS 文件中读取两个数字(代表单个数字的整数和浮点部分),将它们转换为长 double (在我的机器中为 128 位),然后将它们相加。 结果不如我对使用 128 位 float
我正尝试在我的 Python 代码中使用 np.longdouble dtype,并尝试使用 NumPy 来操作我从使用 Cython 编译的 C 模块中获得的长 double 值。 假设我这样做:
(网络上其他大多数相关问题都涉及C的longdouble和python之间的转换。这个问题是不同的。) 我不明白为什么我不能像这样在 python 中正确获取 longdouble: In [72]:
在将 SymPy 表达式转换为 NumPy longdoubles(下面的代码片段)时,我注意到 NumPy 结果中的最后三位数字通常是垃圾。我不明白为什么会发生这种情况,因为我明确指出 NumPy
我想使用 scipy.stats 进行一些概率计算,并避免下溢/溢出:除了使用适当的日志函数之外,我还尝试使用 numpy.longdouble (Ubuntu 上的 float128)来提高浮点精度
我有时间使用 dtype numpy.longdouble,当我尝试将这些值与 timedelta 函数一起使用时,我遇到了错误。但是当我将它转换为 numpy.float64 时,一切都很好。有人可
我一直在玩C99的quad precision长双。据我了解,(特定于平台的)numpy 支持 long double和 128 位 float 。 我遇到了一些我无法解释的事情。 给定: >>> i
我有一段代码,其中一部分计算是使用 NumPy 函数和 longdouble 完成的,另一部分是使用 SymPy 符号微分和数值计算完成的,然后连接在一起(到 SymPy float )。 Sympy
我是一名优秀的程序员,十分优秀!