おっはようございます2010/08/25 04:30

本日のお目覚め、4:30、起床。

本当は、4:13分ごろなんだけど、早すぎて^^;

1.03+0.9=?2010/08/25 20:36

ふつうに足し算すると、1.93だと思うでしょ?

ぶぅーっ。不正解

正確な値は覚えてないけど、1.93000002だったかな?ゼロの数、若干間違ってるかもしれないけど。

なんで、そんなことが起きるのか。

double sum( double a, double b) {
    double result = a + b;
    return result;
}

この関数を、sum(1.03D, 0.9D)で呼ぶと、上記の現象が起きる。doubleって、浮動小数点の有効桁数の多いやつなんだけど、内部表現は2進数だから、正確には表示できない数が出てくる。

今回は、これに引っかかった。大学で、誤差論を学んだときには、足し算・引き算じゃぁ、有効数字は桁数が変わらないって学んだ。でも、それ、10進数の話。2進数には別の落とし穴があったんだ。

今回、この単純なパターンで見つかったけど、どこで発生するのか見えない。でも、たったこれだけで、後の計算結果が変わる。この後、e^nなんて計算するから、もう、普通の電卓じゃぁ務まらない。関数電卓の出番。でも、そんなもの持ってないから、Windowsのアクセサリにある電卓を関数モードで使った。でも、expの使い方が分からなかったから、結局ここからExcelに頼った。

手元に3種類の結果。ひとつは、Excelで計算したもの。もうひとつは、C#でプログラミングして出したもの、最後は、手で計算できるところは電卓をたたき、最後の部分だけExcelで計算したもの。計算結果は、全部違う。この結果を、50万回、14種類の演算しようってるんだから、合うはずねぇの。

さて、明日どうしよう。別のアルゴリズム考えなきゃならんのか?

こんばんは2010/08/25 20:59

娘は、京都に2泊3日の勉強旅行。次男坊は、明日の登校日を控えて、じいちゃんちへ。

ひぃとぉりぃだぁ~

な、なにぃ?2010/08/25 21:01

野田聖子が妊娠しただぁ?

子どもが生まれる頃には、50歳だぁ?

やるじゃねぇか。まだ、あがってなくて、よかったね。

でもね、小学校に入る頃は56歳でしょ?お友達のおばぁちゃんの歳だよ。

子どもが成人するときには、70歳。いやぁ、大変だ。