第五章:数学运算-math:数学函数-指数和对数

5.4.8 指数和对数
指数生长曲线在经济学、物理学和其他科学中经常出现。Python有一个内置的幂运算符(“**”),不过,如果需要将一个可调用函数作为另一个函数的参数,那么可能需要用到pow()。

import math

INPUTS = [
    # Typical uses
    (2,3),
    (2.1,3.2),

    # Always 1
    (1.0,5),
    (2.0,0),

    # Not a number
    (2,float('nan')),

    # Roots
    (9.0,0.5),
    (27.0,1.0 / 3),
    ]

for x,y in INPUTS:
    print('{:5.1f} ** {:4.3f} = {:6.3f}'.format(
        x,y,math.pow(x,y)
        ))

1的任何次幂总返回1.0,同样,任何值的指数为0.0时也总算返回1.0。对于nan值(不是一个数),大多数运算都返回nan。如果指数小于1,pow()会计算一个根。
运行结果:
在这里插入图片描述
由于平方根(指数为1/2)被使用得非常频繁,所以有一个单独的函数来计算平方根。

import math

print(math.sqrt(9.0))
print(math.sqrt(3))

try:
    print(math.sqrt(-1))
except ValueError as err:
    print('Cannot compute sqrt(-1):',err)

计算负数的平方根需要用到复数,这不在math的处理范围内。试图计算一个负值的平方根时,会导致一个ValueError。
运行结果:
在这里插入图片描述
对数函数查找满足条件x = b**y的y。默认log()计算自然对数(底数为e)。如果提供了第二个参数,则使用这个参数值作为底数。

import math

print(math.log(8))
print(math.log(8,2))
print(math.log(0.5,2))

x小于1时,求对数会生成负数结果。
运行结果:
在这里插入图片描述
log()有三个变形。在给定浮点数表示和取整误差的情况下,有log(x,b)生成的计算值只有有限的精度(特别是对于某些底数)。log10()完成log(x,10)计算,但是会使用一种比log()更精确的算法。

import math

print('{:2} {:^12} {:^10} {:^20} {:8}'.format(
    'i','x','accurate','inaccurate','mismatch',
    ))
print('{:-^2} {:-^12} {:-^10} {:-^20} {:-^8}'.format(
    '','','','','',
    ))

for i in range(0,10):
    x =math.pow(10,i)
    accurate = math.log10(x)
    inaccurate = math.log(x,10)
    match = '' if int(inaccurate) == i else '*'
    print('{:2d} {:12.1f} {:10.8f} {:20.18f} {:^5}'.format(
        i,x,accurate,inaccurate,match,
        ))

输出中末尾有*的行突出强调了不精确的值。
运行结果:
在这里插入图片描述
类似于log10(),log2()会完成等价于math.log(x,2)的计算。

import math

print('{:>2} {:^5} {:^5}'.format('i','x','log2',))

print('{:-^2} {:-^5} {:-^5}'.format('','','',))

for i in range(0,10):
    x = math.pow(2,i)
    result = math.log2(x)
    print('{:2d} {:5.1f} {:5.1f}'.format(i,x,result,))

取决于底层平台,这个内置的特殊用途函数能提供更好的性能和精度,因为它利用了针对底数2的特殊用途算法,而在更一般用途的函数中没有使用这些算法。
运行结果:
在这里插入图片描述
log1p()会计算Newton-Mercator序列(1+x的自然对数)。

import math

x = 0.0000000000000000000000001
print('x       :',x)
print('1 + x   :',1 + x)
print('log(1+x):',math.log(1 + x))
print('log1p(x):',math.log1p(x))

对于非常接近于0的x,log1p()会更为精确,因为它使用的算法可以补偿由初始加法带来的取整误差。
运行结果:
在这里插入图片描述
exp()会计算指数函数(e**x)。

import math

x = 2

fmt = '{:.20f}'
print(fmt.format(math.e ** 2))
print(fmt.format(math.pow(math.e,2)))
print(fmt.format(math.exp(2)))

类似于其他特殊函数,与等价的通用函数math.pow(math.e,x)相比,exp()使用的算法可以生成更精确的结果。
运行结果:
在这里插入图片描述
expm1()是log1p()的逆运算,会计算e**x - 1。

import math

x = 0.0000000000000000000000001

print(x)
print(math.exp(x) - 1)
print(math.expm1(x))

类似于log1p(),x值很小时,如果单独完成减法,则可能会损失精度。
运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值