今天CSDN的问答栏目中,有同学提出了一个很有意思的问题:为什么3个1.01直接相乘的结果和1.01的3次方不一样呢?
>>> 1.01*1.01*1.01 1.030301 >>> 1.01**3 1.0303010000000001 1234
从人类的思维角度看,1.01的3次方就是3个1.01相乘,结果自然应该相同。不过,Python计算 a b a^b ab的话,并非是 b b b个 a a a相乘,因为 b b b可以是任意实数,总不能0.5个 a a a相乘吧?
>>> 1.01**(0.5) 1.004987562112089 >>> 1.01**(-0.5) 0.9950371902099892 1234
实际上,Python计算 a a a** b b b,是借助内置函数pow()实现的,该函数通过对数计算将 a b a^b ab转换为 e x e^x ex这样固定底数为 e e e的指数函数。
a b = e l o g a b = e b l o g a a^b = e^{loga^b}=e^{bloga} ab=elogab=ebloga
理解了这个公式,用Python的内置数学模块math,可以很容易地还原Python就算1.01的3次方的过程。
>>> import math >>> math.exp(3*math.log(1.01)) 1.0303010000000001 123
这与CSDN的问答栏目中那位同学的计算结果完全一致。