在SymPy中,当您将浮点数传递给函数时,它会使用浮点数精度自动求值.传递字符串没有什么不同,因为如果字符串有小数点,则会将其转换为浮点数:
In [13]: sympy.sin(0.4)
Out[13]: 0.389418342308651
In [14]: sympy.sin('0.4')
Out[14]: 0.389418342308651
由于sin('0.4')
已经以15位小数精度计算,因此呼叫evalf(30)
不能增加预期结果的准确性.你得到了更多的数字,但它们只是更多的数字,代表了15位近似值的精确值.有了足够的数字,您将看到该近似值的精确值:
In [15]: sympy.sin('0.4').evalf(1000)
Out[15]:
0.38941834230865052246528534851677250117063522338867187500000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000
使用SymPy时,如果您想要精确的值,或者想要使用超过默认的15位十进制数字(53个二进制位)的精度,则应该创建精确的有理数,而不是浮点数:
In [16]: sympy.sympify('0.4')
Out[16]: 0.400000000000000
In [17]: sympy.Rational('0.4')
Out[17]: 2/5
In [18]: sympy.sin(sympy.Rational('0.4'))
Out[18]: sin(2/5)
In [19]: sympy.sin(sympy.Rational('0.4')).evalf(30)
Out[19]: 0.389418342308650491666311756796
evalf
需要像上面的sin(2/5)
这样的精确表达式才能计算出精确到指定位数的答案.最后一个结果与30位的mpath一致,并且实际上是由mpath计算的,而SymPy在内部使用mpath表示evalf
.