Floating point 如何使用sympy处理浮动?

Floating point 如何使用sympy处理浮动?,floating-point,sympy,Floating Point,Sympy,这是我使用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

这是我使用
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
问题:分数(…)方法有什么怪癖/怪癖吗?Rational('.1')会为您创建一个精确的分数。但是当标志
rational
为True时,
nsimplify
可以接受各种容器并将任何小数更改为有理数:

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

好的,只有可以写成2的完美幂和的十进制数才能精确地表示为二进制浮点。Nor 0.1或2.4均不满足此要求,因此它们必须近似。如果你想要精确的结果,分数是最好的选择。奇怪的是,对于复杂的表达式,事情可能会变得很慢,特别是如果你想对它们进行大量计算的话。选民:我们不要把它作为“浮点数学坏了吗?”?