Decimal
オブジェクトを
from sympy import *
from decimal import *
getcontext().prec = 100 # Decimalの精度100桁
弟子丸 = Decimal(1)/ Decimal(3)
x = Symbol("x")
print("decimal:", 弟子丸)
print("sympy.nsolve:", nsolve(x-弟子丸, x, 1, prec=100))
# =0 について解く 初期予測値 精度
これをPython 3.8.3 (default, Jul 2 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
な環境で実行した結果が次の通り
結果
decimal: 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
sympy.nsolve: 0.3333333333333333148296162562473909929394721984863281250000000000000000000000000000000000000000000000
decimal
オブジェクトをsympy
に渡すと、精度が落とされてしまうようだ。
ちなみにこれはnsolve
だけの問題ではなく、evalf
を使っても同様。
expr = x
print("sympy.evalf:", expr.evalf(100, subs={x:d}))
結果
sympy.evalf: 0.3333333333333333148296162562473909929394721984863281250000000000000000000000000000000000000000000000
次のように、未計算のオブジェクトを渡し、sympy
に解かせれば、確かにsympy
でもちゃんとした精度を得られる。
y = Symbol("y")
expr = x/y
print("sympy.evalf:", expr.evalf(100, subs={x:Decimal(1), y:Decimal(3)}))
結果
sympy.evalf: 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333