IchigoJam でBMIを求めようとしてみた。
BMI
BMIは、体重[kg]を身長[m]の2乗で割った値で、肥満度のチェックに用いられる。
IchigoJam BASICとBMI
IchigoJam BASICの変数は、-32768~32768の整数しか扱えず、BMIをそのまま求めるのは難しい。
そこで、身長はcm単位、体重はkg単位の値を10倍した値を入力してもらうことにした。
これらの値は、通常の人間であれば10進数で2~4桁程度の値であると想定され、まあ扱えそうである。
この身長の値をH
、体重の値をW
とおくと、身長[m]はH/100
、体重[kg]はW/10
なので、BMIは以下のように表せる。
BMI = (W/10) / ((H/100)*(H/100))
= (W/10) / (H*H/10000)
= (W/(H*H)) * 1000
さらに、BMIを小数第1位まで表示するため、この値にさらに10を掛ける。
すると、求める値はW
をH
で2回割って10
を4回掛けた値ということになる。
「10を掛ける」は、さらに「2を掛ける」と「5を掛ける」に分解できる。
そこで、
- 「掛ける」操作をなるべく多く行って、割る際の誤差を減らす
- 「掛ける」操作ができなくなった (行うとオーバーフローする、または行う操作が無い) 場合は、「割る」操作の回数が残っていれば「割る」操作をする
- 「掛ける」操作も「割る」操作もできなくなったら終了
という戦略で計算を行うことにした。
プログラム
今回は、簡単のため「掛ける」操作をなるべく多く行うための計算を省略し、適当な貪欲法を用いている。
これでは、50行目と60行目を入れ替えると結果が変わることがあり、最適な操作になっていないようである。
10 ' BMI ケイサン
20 INPUT "シンチョウ(cm):",H
30 INPUT "タイジュウ(kg ノ 10 バイ):",W
40 X=4:Y=4:Z=2:B=W
50 IF X>0 AND B<6553 B=B*5:X=X-1:GOTO 50
60 IF Y>0 AND B<16384 B=B*2:Y=Y-1:GOTO 50
70 IF Z>0 B=B/H:Z=Z-1:GOTO 50
80 ?"BMI:";B/10;".";B%10
実行結果例
例として大石泉さんの情報 (157cm 41kg) を入力してみた。
大石泉 (おおいしいずみ)とは【ピクシブ百科事典】
結果は16.5と出たが、この場合の正しいBMIは約16.63であり、誤差が出ている。
今後の課題
- 割り算を行う際の誤差を最小にできるような掛け算のやり方を求めるプログラムを作る
- 多倍長計算やマシン語を用いて正確な値を求める
おわりに
※IchigoJamはjig.jpの登録商標です。