Python中带小数的错误
下面是简单的代码:Python中带小数的错误,python,decimal,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)
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位左右,我的答案比这个更准确 我认为问题在于:
return Decimal(math.atan(10**(-x+1)))
我可以想象,该公式中的所有计算(尤其是math.atan函数)都将作为一个普通精度浮点数进行计算,然后转换回300位小数
如果你想要300点的精度,你必须找到一种方法来确保每一次计算都达到该精度或更高的精度,因为你的结果只能和你最不精确的计算一样精确。我认为问题在于:
return Decimal(math.atan(10**(-x+1)))
我可以想象,该公式中的所有计算(尤其是math.atan函数)都将作为一个普通精度浮点数进行计算,然后转换回300位小数
如果你想要300点的精度,你必须找到一种方法来确保每一次计算都达到该精度或更高的精度,因为你的结果只能和你最不精确的计算一样精确。我认为问题在于:
return Decimal(math.atan(10**(-x+1)))
我可以想象,该公式中的所有计算(尤其是math.atan函数)都将作为一个普通精度浮点数进行计算,然后转换回300位小数
如果你想要300点的精度,你必须找到一种方法来确保每一次计算都达到该精度或更高的精度,因为你的结果只能和你最不精确的计算一样精确。我认为问题在于:
return Decimal(math.atan(10**(-x+1)))
我可以想象,该公式中的所有计算(尤其是math.atan函数)都将作为一个普通精度浮点数进行计算,然后转换回300位小数
如果您想要300点的精度,您必须找到一种方法来确保每次计算都达到该精度或更高的精度水平,因为您的结果将只与最低精度的计算一样精确。十进制不会扩展您的精度,因为您使用的是
数学模块。但这不是重点。你确定你的计算是正确的吗?刚刚试过:
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
这基本上就是您期望的结果。十进制并不能扩展您的精度,因为您使用的是数学
模块。但这不是重点。你确定你的计算是正确的吗?刚刚试过:
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
这基本上就是您期望的结果。十进制并不能扩展您的精度,因为您使用的是数学
模块。但这不是重点。你确定你的计算是正确的吗?刚刚试过:
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
这基本上就是您期望的结果。十进制并不能扩展您的精度,因为您使用的是数学
模块。但这不是重点。你确定你的计算是正确的吗?刚刚试过:
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
这基本上是您期望的结果。我只是尝试执行代码片段,但它对我不起作用。错误消息为ValueError:pre-last行中格式为
的零长度字段名。使用Ipython和Python 2.6.8执行…@WWhisperer将0
{0:.16f}
添加到formatting@WWhisperer:该打印格式需要Python 2.7或更高版本。但是Padraic展示了如何使其与Python2.6及更高版本兼容。math
模块不会神奇地继承decimal
的精度。如果你想用各种各样的奇异函数来做任意精度的数学,请检查好了,谢谢。我已经认为问题出在f(x)
函数中,正如托尼在回答中所说的那样。。。我只是想确保我没有发布未经搜索的答案。我只是尝试执行代码片段,但它对我无效。错误消息为ValueError:pre-last行中格式为
的零长度字段名。使用Ipython和Python 2.6.8执行…@WWhisperer将0
{0:.16f}
添加到formatting@WWhisperer:该打印格式需要Python 2.7或更高版本。但是Padraic展示了如何使其与Python2.6及更高版本兼容。math
模块不会神奇地继承decimal
的精度。如果你想用各种各样的奇异函数来做任意精度的数学,请检查好了,谢谢。我已经认为问题出在f(x)
函数中,正如托尼在回答中所说的那样。。。我只是想确保我没有发布未经搜索的答案。我只是尝试执行代码片段,但它对我无效。错误消息为ValueError:pre-last行中格式为
的零长度字段名。使用Ipython和Python 2.6.8执行…@WWhisperer将0
{0:.16f}
添加到formatting@WWhisperer:该打印格式需要Python 2.7或更高版本。但是Padraic展示了如何使其与Python2.6及更高版本兼容。math
模块不会神奇地继承decimal
的精度。如果你想用各种各样的奇异函数来做任意精度的数学,请检查好了,谢谢。我已经认为问题出在f(x)
函数中,正如托尼在回答中所说的那样。。。我只是想确保我没有发布未经搜索的答案。我只是尝试执行代码片段,但它对我无效。错误消息为ValueError:pre-last行中格式为
的零长度字段名。使用Ipython和Python 2.6.8执行…@WWhisperer add