math
是一个Python模块,许多人使用它来执行更高级的数学函数,并使用decimal
模块。人们可以正确地计算出1.2-1.1=0.0999~
,但使用decimal
类型是0.1
。
我的问题是这两个模块不能很好地相互配合。例如,log(1000, 10)=2.9999~
,但使用decimal
类型会得到相同的结果。我怎样才能让这两个互相配合?我需要实现自己的功能吗?难道没有办法吗?
每个Decimal
实例都有Decimal.log10
、Decimal.ln
和Decimal.logb
方法,还有更多(max
、sqrt
(:
from decimal import Decimal
print(Decimal('0.001').log10())
# Decimal('-3')
print(Decimal('0.001').ln())
# Decimal('-6.907755278982137052053974364')
不过没有三角函数。
用于任意精度计算的更高级的替代方案是mpmath,可在PyPI获得。当然,它不会为您提供sin
或tan
,因为对于许多x
值来说,sin(x)
是不合理的,因此将其存储为Decimal
是没有意义的。然而,给定固定的精度,您可以在mpmath
的帮助下通过Tailor系列等计算这些函数。你也可以做Decimal(math.sin(0.17))
来得到一些小数,它包含了接近0.17弧度的正弦。
也可以参考官方的十进制食谱。
Decimal中有一个log10方法。
from decimal import *
a = Decimal('1000')
print(a.log10())
然而,如果你试图用精确的整数解来求解对数,那么对我来说,使用一个计算对数精确值的函数会更有意义。在典型的使用中,对数函数通常会输出一些不合理的结果。您可以使用for循环和重复除法。