Как обращаться с поплавками с симпой? - PullRequest
1 голос
/ 09 февраля 2020

Это какой-то диалог, который у меня был с python с использованием ipython

In [1]: from sympy import symbols                                                                

In [2]: a,b,c,d,e = symbols('a b c d e')                                                         

In [3]: expr = a*b*c*d - e                                                                       

In [4]: expr.subs({'a':2, 'b':3, 'c':4, 'd':'.1', 'e':'2.4'})                                    
Out[4]: 4.44089209850063e-16

Как получить 0 там?


Я попробовал это и работает:

from sympy import symbols
from fractions import Fraction
a,b,c,d,e = symbols('a b c d e')
expr = a*b*c*d - e
expr.subs({'a':2, 'b':3, 'c':4, 'd':Fraction('.1'), 'e':'2.4'})

Out: 0

expr.subs({'a':2, 'b':3, 'c':4, 'd':Fraction('.1'), 'e':'2.4'}) == 0

True

Вопрос: Есть ли причуды / ошибки с подходом дроби (...)?

1 Ответ

1 голос
/ 10 февраля 2020

Rational ('. 1') создаст для вас точную долю SymPy. Но nsimplify может принимать различные контейнеры и изменять любые десятичные дроби на Rationals, если флаг rational установлен в True:

>>> reps
{'a': 2, 'b': 3, 'c': 4, 'd': '.1', 'e': '2.4'}
>>> nsimplify(reps, rational=True)
{a: 2, b: 3, c: 4, d: 1/10, e: 12/5}
>>> sympify('a*b*c*d - e').subs(_)
0
...