中学生向けにプログラミングを教えると、
中学で習いたての言葉であるにも関わらず、
意図しない結果に遭遇するということが時々ある。
例えば、
整数と実数というのを中学生で習う。
整数は0から1ずつ足していった値と0から-1ずつ足していった(1ずつ引いた)値の総称のことで、
実数は整数では表現できない1.1といった小数点を含むもの。
1は整数であって、1.0であっても同義なので実数でもある。
でね、
前回、省略していたけど、
JavaScriptの前に整数と実数を厳密に扱う言語から触れてもらっているんだけど、
その時によく発生するのが平均がうまく出せないともの
例えば、クイズアプリのコードを書く際に正解率を求める話があったとする。
5問(整数:int)出題があって、4問(整数:int)正解しました。
正解率は小数点(float)がありだから、実数にするかということで、
下記の様なプログラムを書く。
(例はC言語で書きます)
hoge.c
#include <stdio.h> void main() { int seikaisuu = 4; int syutsudaisuu = 5; float seikairitsu; seikairitsu = seikaisuu / syutsudaisuu * 100; printf("正解率は%f%", seikairitsu); }
これを実行する前に手計算で結果を求めてもらうと、
4 / 5 * 100 で正解率は80%だよねとなるんだけど、
このコードを実行してみると、
$ gcc hoge.c $ ./a.out 正解率は0.000000%
あら、不思議!
0%になっちゃうよ!
ということで、
手計算とパソコンの演算の違いから整数と実数の違いを深く考えてもらうという機会を得ることができました。
(これが面白いかわからないけど…)
この手の話でもう一個。
少数同士の足し算ね。
0.2 + 0.12
普通に足したら0.32になる。
これをプログラムで書くと、
hoge.c
#include <stdio.h> void main() { float a = 0.2; float b = 0.12; printf("0.2 + 0.12 = %f10", a + b); }
になり、実行すると、
$ gcc hoge.c $ ./a.out 0.2 + 0.12 = 0.32000010
になる。
計算結果が若干ずれるというざっくりとした理由はわかるけど、
なぜ小数点第7位に1がくるのかを説明することはできなかった。
(小数点同士の計算がずれる理由は、2進数で小数点を表現することが難しいから。詳細は省略)
コードを書いて、何らかの動きを作ることは話せるけど、
知的好奇心を満たす程の数学力はまだまだ足りないなと思った瞬間でした。