累乗の計算
高木です。こんばんは。
今回はごく初歩的な話題です。
現在、今月から入社した新人の教育を行っているのですが、先日伝えようと思って伝え忘れていたことがあります。
せっかくなので、ブログのネタにしてしまおうというのが今回の話題です。
まずは、何をやっているかから説明しましょう。
マウスカーソルの現在の座標が、円の中に入っているかどうかを判定させています。
なぜそんなことをするかについては、今回は割愛することにします。
とにかく、円の中にマウスカーソルがあるかどうかを判定する必要があるのです。
判定の方法は極めて安直で、三平方の定理を用いて行います。
具体的には、円の中心座標が\((x_{0}, y_{0})\)、半径が\(r\)のとき、マウスカーソルが座標\((x, y)\)だとすると、
が成立するかそうかを調べればいいことになります。
このとき2乗の計算が出てきますね。
累乗の計算なので、「累乗関数を使えばいいや」と思うのは自然な発想です。
Cであればpow関数、C#であればMath.powメソッドを使うことになりますね。
他の言語でも似たような関数があるかと思います。
確かにそれでも間違いではありません。
しかし、私のようなチープなプラットフォームでの経験を重ねてきた身としては、そういうのは非常に気持ちが悪いのです。
単なる2乗の計算であれば、累乗関数を使うのではなく、同じものを掛け合わせる方が圧倒的に効率がよいというものです。
累乗関数は、指数関数と対数関数を組み合わせて実現していることがほとんどでしょう。
すなわち、
の計算をすることになります。
指数関数と対数関数は、それぞれマクローリン展開を用いて計算することになるかと思います。
微分の計算をして級数展開するまでは机上で行うとしても、結構な計算が必要になることがわかるはずです。
一方で、2乗の計算を行うのに、同じ数値を掛け合わせるというのは非常にシンプルで、しかもわかりやすいと思います。
これを時期尚早な最適化という人はいないでしょうし、もしいるのなら、ちょっと関わり合いになりたくない人でしょう。
まとめですが、累乗(べき乗)の計算を行うのは、素直に計算するより、一ひねりした方が圧倒的に高速になるということです。
大して速度を要求されない用途であるとか、マシンスペックが非常に高い場合は、こんなことは気にしなくてもいいかもしれませんね。