获得"大"错误似乎太大而不能单独舍入

Joh*_*ohn 2 python math numpy rounding python-3.x

当我使用Python时,我得到一些重要的舍入错误,这些错误对于简单的浮点问题来说似乎太大了.我有以下变量:

p = 2.2*10**9
m = 0.510999*10**6
Run Code Online (Sandbox Code Playgroud)

然后我通过以下内容发送它:

b = 1/np.sqrt((m/p)**2 + 1) = 0.99999997302479693
Run Code Online (Sandbox Code Playgroud)

然后我通过另一个应该返回p的等式使用这个值:

p = (1/np.sqrt(1-b**2)) * m * b = 2200000008.1937...
Run Code Online (Sandbox Code Playgroud)

前面提到的p的差异为8.19 ...(如果使用科学记数法,则在小数点后第9位误差),这似乎太大而不仅仅是舍入问题.

我尝试使用Decimal().sqrt()任意高精度的所有计算,我得到的差值为1.8935 ......,这只是稍微好一些.

有更好的方法来获得更高的精度吗?

Dr.*_*ann 5

这是操作

sqrt(1+x)
Run Code Online (Sandbox Code Playgroud)

这会让你失去那么精确.或者真的1+x是它的一部分.由于你x=(m/p)**2的幅度很大1e-6,你会丢失15-16个有效十进制数字的5-6位数字x,因此只剩下9-10个有效数字.在重建过程中,您可以确切地看到,(仅)前9个数字是正确的.