Python中带小数的不准确

时间:2015-03-30 12:25:44

标签: python decimal

以下简单代码:

from decimal import getcontext
from decimal import *
import math

context = getcontext()
context.prec = 300    

def f(x):
    return Decimal(math.atan(10**(-x+1)))

def xNext(x,y):
    return x-y*f(2)


def yNext(x,y):
    return y+x*f(2)

x= Decimal(1)
y = Decimal(0)

x=xNext(x,y)
y=yNext(x,y)

x=xNext(x,y)
y=yNext(x,y)

x=xNext(x,y)
y=yNext(x,y)

print("{:.16f}".format(x))
print("{:.16f}".format(y))

返回

0.9702971603146833
0.2950554229911823

哪个错误,应该在0.97019857和0.2980158649附近 我认为这是一个舍入错误,但这段代码应该工作到小数点后300位。

不确定是否有不同的问题真的要去300个地方......

编辑:是的,我怀疑这是一个舍入错误,我在wolfram上完成了相同的过程,一次只能到大约20个小数位,我的答案比这个更准确。

2 个答案:

答案 0 :(得分:2)

Decimal不会扩展您的精度,因为您使用math模块。但那不是重点。你确定你的计算是正确的吗?刚试过:

x, y = 1, 0
x, y = xNext(x,y), yNext(x,y)
x, y = xNext(x,y), yNext(x,y)
x, y = xNext(x,y), yNext(x,y)

它导致

0.970198479132
0.298015864998

这基本上是您的预期结果。

答案 1 :(得分:1)

我认为问题在于:

 return Decimal(math.atan(10**(-x+1)))

我认为该公式中的所有计算(尤其是math.atan函数)都将计算为普通精度浮点数 - 然后转换回小数点后的300小数。

如果你想要300点精度,你必须找到一种方法来确保每次计算都执行到那个精度水平或更好,因为你的结果只会与你的最精确计算一样精确。