LoginSignup
3
0

More than 3 years have passed since last update.

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
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0