なぜ1.01*1.01*1.01=1.030301、1.01**3=1.030301000001なのか.
今日CSDNの問答欄の中で、ある学友は1つのとても面白い問題を提出しました:どうして3つの1.01の直接乗算の結果と1.01の3次方は違いますか?
人間の思考の角度から見ると、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が乗算されないのではないでしょうか.
実際、Python計算a a**b b bは、対数計算によりa b a^b abをe x e^x exのような固定基数e e eの指数関数に変換する内蔵関数pow()によって実現される.
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次方程式である過程を容易に復元できる.
これはCSDNの問答欄のあの学生の計算結果と完全に一致している.
>>> 1.01*1.01*1.01
1.030301
>>> 1.01**3
1.0303010000000001
人間の思考の角度から見ると、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
実際、Python計算a a**b b bは、対数計算によりa b a^b abをe x e^x exのような固定基数e e eの指数関数に変換する内蔵関数pow()によって実現される.
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
これはCSDNの問答欄のあの学生の計算結果と完全に一致している.