Следующий простой код:Неточности с десятичными знаками в Python
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 мест ...
EDIT: Да, я сомневаюсь, что это ошибка округления, я только что сделал тот же самый процесс на вольфрам только около 20 знаков после запятой в то время, и мой ответ более точен, чем этот.
Я просто попытался выполнить фрагмент кода, но он не работает для меня. Сообщение об ошибке «ValueError: имя поля нулевой длины в формате» в предыдущей строке. Выполнение с помощью Ipython и Python 2.6.8 ... – WWhisperer
@WWhisperer добавить '0'' {0: .16f} 'к вашему форматированию –
@WWhisperer: для этого формата печати требуется Python 2.7 или выше. Но Padraic показывает, как сделать его совместимым с Python 2.6 и более поздними версиями. –