コンピュータによる計算では、時折面白いことが起きますが、 少し前、事務担当者から呼ばれた事例は、次のようなものでした。
ご本人が書いて、長年正常に動いていた awk のスクリプトが、 そのときだけ計算を間違え、 1 円の誤差が出たというのです。
その、間違えた計算というのは、次のような単純な数式で、
金額 = 単価 * 数量このときの単価は 130.2 円/kg、数量は 1000 kg でした。
人間は
130.2 * 1000 = 130200を期待しますが、コンピュータは
130.2 * 1000 = 130199
と言ってきます。
問題のプログラムは下記のようになっていました。
awk ' BEGIN { u = 130.2 # 単価 a = 1000 # 数量 p = int(u * a) # 円未満切捨て print u, "*", a, "=", p exit 0 }'実行すると、下記の結果が得られます。
130.2 * 1000 = 130199もちろん、c で書いても同じです。
#include <stdio.h> #include <math.h> main() { double u, a, p; u = 130.2; /* 単価 */ a = 1000.0; /* 数量 */ p = floor(u * a); /* 円未満切捨て */ printf("%g * %g = %g\n", u, a, p); }
お金の計算ですから、1 円の差を無視するわけにもゆかず、原因を明らかにして、 対策を考えなければなりませんが、理系の人々は日頃の訓練がありますから、 すぐピンとくるわけで、これ以上お読みになる必要はないと思います。
そうでなくて、この種の問題が始めてでしたら、 まず、原因を見つける努力をして、 それがうまくゆかないとき、残りをお読みになってください。
平林 浩一, 2001