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均不满足此要求,因此它们必须近似。如果你想要精确的结果,分数是最好的选择。奇怪的是,对于复杂的表达式,事情可能会变得很慢,特别是如果你想对它们进行大量计算的话。选民:我们不要把它作为“浮点数学坏了吗?”?