VBAの勉強を始めてみた

タイトルの通りVBAの勉強を始めました。仰々しくなく、シンプルな形で効率化を図ることを目指しています。VBA以外の話題もあるよ(笑)

コサイン90度は0にならない?

先日、仕事で三角関数を使う場面があったのですが、エクセルでcosの計算をしたところ、90°のところで結果が「0」にならず、一瞬ぽかーんとなってしまいました。
「あるぇ~、確かcos90°って0になるはずだよね?もしかして今まで勘違いしてたんだろうか(゜ρ゜)」
いや、そんなハズはない・・・でも、エクセル先生がお示しになるのは「6.12574E-17」っていう0に近いけれど、0じゃない数値なんだな・・・(゜ρ゜)
はて・・・?

ということで、疑問を解消するために少し調べたので、整理してみます。

 

まず、角度の単位についておさらい

デグリー:角度を度で表す
ラジアン:角度をπで表す
グラード:角度をg(1g=0.9度)で表す 

Deg Rad Grad
0 0 0
30 π/6 33.3・・・
45 π/4 50
60 π/3 66.6・・・
90 π/2 100
180 π 200
270 1.5π 300
360 400

ちなみに、電卓で「Deg」「Rad」「Grad」のモードがあると思いますが、これは角度の計算をどの単位で行うかを切り替えるものです。(今まで生きててGradは一度も使ったことがありませんが・・・(;^_^A)

 

んで、エクセルではどの単位で計算するのかというと「ラジアン」のほうで計算することになっています。

COS(90) ←×
COS(π/2) ←○
COS(100) ←×

πは関数PI()で取得できるので、数式にCOS(PI()/2)と入力するか、デグリーをラジアンに変換するRADIANS関数を入れ子にして、COS(RADIANS(90))と入力することになります。しかし、ここでコンピューターの限界が生じてしまいます。πは皆さんご存知のとおり、小数以下が循環せずに続く無理数です。

 

π=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502・・・

 

エクセルで扱うことができる有効桁数は15桁まで

ここからが本題です。エクセルで扱うことができる有効桁数は15桁までなので、関数PI()の中に入っている円周率は、3.14159265358979の15桁までであり,これを計算に使うと僅かな誤差がでてしまいます。

理論的にcos90°は0ですが、エクセル先生はそんなことを知らずにクソまじめに15桁に打ち切られた数値を使って計算をし、結果、僅かな誤差を伴った答えを導きだすのです。
cos270°、sin180°、tan180°も同様です。

これを浮動小数点演算誤差の打切り誤差とゆーそうです。コンピューターには他にも多くの誤差があるそうで・・・機会があれば勉強してみます・・・ゴフッ(吐血)

 

ちょっと補足
sin0°やtan0°は引数にπを使っていないので、結果はちょうど0になります。
sin30°は引数にπを使うのでちょうど0.5にならないような気がしますが、有効桁数15桁超の誤差が打ち切られてちょうど0.5になっているように見えます(たぶん)
sin90°も引数にπを使うのでちょうど、1にならないような気がしますが、有効桁数15桁超が切り捨てられてちょうど1になっているように見えます(たぶん)
その他は、誤差があってもわからないレベルの世界。

 

まとめ!

有効桁数15桁で打ち切られた円周率(もどき)を使って計算するため、僅かな誤差が生じる。誤差は非常に僅かなので、ほとんど分からないが・・・0が0でなくなってしまった場合には誤差が大きいと感じてします。は違うものなので、コンピューターの中で誤差が生じていることを理解しておきましょう!