見出し画像

数学が苦手なのにプログラマーになってホントに大丈夫?

数学の知識がないと質の高いプログラムはできないと思う 

 「数学が苦手でも、四則演算がわかれば大丈夫ですよー 文系の出身者もたくさんいますよ」みたいな記事がネット上にたくさんあって、それを本気にしてプログラマーを志すのは危険じゃないかなあ・・と、心配してしまいます。 ウエブサイトを作るとか、表計算を自動化するという程度なら、既存のアプリをいじるだけなので言語を学ぶだけですむかもしれません。しかし、プロになって、それだけで食べていけるんですかね。だんだん能力に差がついてきて、離職する人って多いんじゃないのかな。
 
 私も数学はあまり得意ではありません。しかし、数学の知識があるとないとではプログラミング能力に大きな差があることは理解しています。足し算だけで成り立ってるプログラムでもその差は歴然としています。

1から1000000000まで全部足すといくつになりますか?パソコンが間違える

 10億までの足し算です。単純計算の繰り返しでパソコンがもっとも得意とするところですよね。命令を素直にコーディングしてやれば次のようになります

Sub gokei()

m = 10 ^ 9
For i = 1 To m

 n = n + 1
 s = s + n
 Next i
 
 Debug.Print s
 
End Sub

出力に Debug.Printを使っています。イミディエイトウィンドウに表示されますのでご注意ください。面倒な方はMsgBoxでも大丈夫です。

実行結果
所要時間 31.1秒 
計算結果  5.00000000067109E+17  
     5.00000000067109×10^17(10の17乗)です。
環境はwindows11、EXCEL2019、core i5 11400, Memory16G, SSD(SATA)です。2022年現在では、比較的新しいスペックです。低性能でもありません。
それにも関わらず30秒もかかった上に、答えが間違ってます

数学的な処理をして正解を求める。

 1から10まで全部足すと55になります。1から100まで足すといくつになるか?数字をいじるのが好きな人は30秒もかからず答えをだせますよね。1から100まで並べておいて「0と100」「1と99」・・・「49と51」と100になるペアを作ると50組できます。最後に50が余るから

100×50+50=5050 

 この式の100は二つの数を合わせたもの、その次の50は組数、最後の50は組する相手がいなかった真ん中の数字です。今、合計値をSとして、100をnに置き換えると、

S=n×(n/2)+n/2
 
という一般式が成立します。
1000までの合計を求めてみましょう。
S=1000×(1000/2)+1000/2
 =1000×500+500=500500
 になります。

1000000000くらいならパソコンに頼らなくてもできる

1000000000=1.000000000×10⁹ と置きます。面倒だから1*10^9 と書きますね。

 S=(1*10^9)*(1*10^9)/2 +( 1*10^9)/2
    =0.5*10^18+0.5*10^9
    =5.0*10^17+5.0*10^8
    =500000000500000000
   =5.000000005*10^17
   =5.000000005E+17 これが正解です。

このアルゴリズムを使ってコーディングする

Sub gokei2()

n = 10 ^ 9
s = n * n / 2 + n / 2
Debug.Print s 

End Sub

実行結果
所要時間 ?秒 押した瞬間に結果が出る
計算結果  5.000000005E+17 正解

なぜ答えを間違えるのか

VBA(だけではありませんが)は大きな数を指数で表します。
1000000000=1.000000000×10⁹
のような表し方ですね。この小数がどうも信頼できません。桁数が多くなると、あるところで四捨五入をするのですが、計算回数が多くなると切り捨て、切り上げの誤差が積み重なって大きな差になります。最初のコードでも10⁸までは正解がでます。2番目のコードでも10の15乗では
  5.00000000000001E+29 になります。
小数点以下15位で四捨五入をしていることがわかります。

簡単な足し算でさえこんなに大きな差ができる

 本当に足し算だけでも、数学的な処理のありなしでその差は大きなものになります。プログラムは場合分け(条件分岐)と繰り返しの連続で、計算回数が多ければ誤差も大きくなりますし、処理も遅くなります。少ない計算回数で正確な結果をだすために、数学の知識は必要だと思うのですが、いかがでしょう。