强基初中数学&学Python——第205课 数字和数学模块之二: math数学函数(三)


  幂函数与对数函数

 

  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的浮点数xexp(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