幂函数与对数函数
exp(x)
返回 e 的 x 次幂,其中 e = 2.718281... 是自然对数的基数。这通常比 math.e ** x 或 pow(math.e, x) 更精确。
>>>from math import exp,e
>>>exp(1),e
(2.718281828459045, 2.718281828459045)
>>>exp(2),e**2,pow(e,2)
(7.38905609893065, 7.3890560989306495, 7.3890560989306495)
expm1(x)
返回 e 的 x 次幂减1。这里 e 是自然对数的基数。对于接近0的浮点数x,exp(x) - 1中的减法可能导致重大精度的损失。expm1() 函数采用不同的算法,消除这因减法而导致的精度损失,使结果为全精度浮点数:
>>>from math import exp,expm1
>>>exp(1e-5)-1,expm1(1e-5)
(1.0000050000069649e-05, 1.0000050000166667e-05)
>>>exp(1e-10)-1,expm1(1e-10)
(1.000000082740371e-10, 1.00000000005e-10)
>>>exp(1e-15)-1,expm1(1e-15)
(1.1102230246251565e-15, 1.0000000000000007e-15)
>>>exp(1e-16)-1,expm1(1e-16)
(0.0, 1e-16)
log(x[, base])
当使用一个参数,是exp的逆函数,返回 x 的自然对数(底为 e )。使用两个参数,pow(base,x)的逆函数,返回给定的 base 的x的对数 ,即 log(x)/log(base) 。
>>>from math import exp,log,e
>>>log(e)
1.0
>>>exp(1.0)
2.718281828459045
>>>log(100,10),log(100)/log(10)
(2.0, 2.0)
>>>exp(2.0*log(10)),10**2.0,pow(10,2.0)
(100.00000000000004, 100.0, 100.0)
log1p(x)
返回 1+x 的自然对数(以 e 为底),是expm1的逆函数。用于接近零的 x 精确地计算结果。
>>>from math import log,log1p
>>>log1p(1e-5),log(1+1e-5)
(9.99995000033333e-06, 9.999950000398841e-06)
>>>log1p(1e-10),log(1+1e-10)
(9.999999999500001e-11, 1.000000082690371e-10)
>>>log1p(1e-15),log(1+1e-15)
(9.999999999999997e-16, 1.110223024625156e-15)
>>>log1p(1e-20),log(1+1e-20)
(1e-20, 0.0)
log2(x)
返回以2为底x的对数,通常比 log(x, 2) 更准确。对于正整数,它的向上取整ceil是该整数的二进制位数。
>>>from math import log,log2,ceil
>>>num=3141592653589793
>>>log2(num),log(num,2),ceil(log2(num)),num.bit_length()
(51.480417552782754, 51.480417552782754, 52, 52)
参见 int.bit_length() ,它表示二进制整数所需的位数,不包括符号和前导零。
log10(x)
返回以10为底x的对数,通常比 log(x, 10) 更准确。
>>>from math import log,log10
>>>num=3141592653589793
>>>log10(num),log(num,10)
(15.497149872694134, 15.497149872694132)
pow(x, y)
将返回 x 的 y 次幂。pow(1.0, x) 和 pow(x, 0.0) 总是返回 1.0 ,即使 x 是零或NaN。如果 x 和 y 都是有限的,而且 x 是负数, y 不是整数,那么 pow(x, y) 不在实数值域内,抛出 ValueError 。
>>>import math
>>>math.pow(1.5,2)
2.25
>>>math.pow(1.0,-1),math.pow(1.0,0),math.pow(1.0,1)
(1.0, 1.0, 1.0)
>>>math.pow(1.0,math.nan),math.pow(1.0,math.inf),math.pow(1.0,-math.inf)
(1.0, 1.0, 1.0)
>>>math.pow(-1.0,0.0),math.pow(0.0,0.0),math.pow(1.0,0.0)
(1.0, 1.0, 1.0)
>>>math.pow(-math.inf,0.0),math.pow(math.nan,0.0),math.pow(math.inf,0.0)
(1.0, 1.0, 1.0)
>>>math.pow(-1,1.1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
>>>pow(-1,1.1)
(-0.9510565162951535-0.30901699437494773j)
>>>from fractions import Fraction
>>>math.pow(-27,Fraction(1,3))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
对于参数都是正整数的情况,与内置的 ** 运算符不同, math.pow() 将其参数转换为 float 类型,然后使用 ** 或内置的 pow() 函数来计算幂,返回总是浮点数;**或内置pow()则返回整数。
>>>math.pow(4,2),4**2,pow(4,2)
(16.0, 16, 16)
sqrt(x)
返回 x 的平方根, x必须为非负数,否则抛出ValueError异常。
>>>from math import sqrt
>>>sqrt(2)
1.4142135623730951
>>>sqrt(0)
0.0
>>>sqrt(-2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error