sympy and Decimal seem to be on bad terms

Decimal object

from sympy import *
from decimal import *

getcontext().prec = 100 #Decimal precision 100 digits
Disciple Maru= Decimal(1)/ Decimal(3) 
x = Symbol("x")

print("decimal:",Disciple Maru)
print("sympy.nsolve:", nsolve(x-Disciple Maru,          x,         1, prec=100))
#                             =Initial prediction value to solve for 0 Accuracy

The result of executing this in the environment of Python 3.8.3 (default, Jul 2 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win 32 is as follows.

result


decimal: 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
sympy.nsolve: 0.3333333333333333148296162562473909929394721984863281250000000000000000000000000000000000000000000000

Passing a decimal object to sympy seems to reduce the precision. By the way, this is not just a problem with nsolve, it is the same with evalf.

expr = x
print("sympy.evalf:", expr.evalf(100, subs={x:d}))

result


sympy.evalf: 0.3333333333333333148296162562473909929394721984863281250000000000000000000000000000000000000000000000

If you pass an uncalculated object and let sympy solve it as follows, you can certainly get proper precision even with sympy.

y = Symbol("y")

expr = x/y
print("sympy.evalf:", expr.evalf(100, subs={x:Decimal(1), y:Decimal(3)}))

result


sympy.evalf: 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

Recommended Posts

sympy and Decimal seem to be on bad terms
Good and bad code to compare on a minimap
Python 3.6 on Windows ... and to Xamarin.
Make a chatbot and practice to be popular.