おっはようございます ― 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歳。いやぁ、大変だ。
最近のコメント