職場で

丸め誤差知らない奴キター。つうか、丸め誤差知ってるやつが全然居ないともいう。まあ、ぼんやり相当眺めてないと気づかなかった私も大きな口は利けないが。オゼゼ扱ってていいのか?それ。

10進小数点数を2進で表現出来ないことがあることによって丸め誤差というのが発生する。有名なのは0.1(10進)で、2進に直すと0.0001100110011…となる(数字はググったので誤るかもしれないw)。こういうのは「およそ3.14」みたいな感じで適当な桁で切らないとならないので、誤差となる。まあ、17桁くらいはいけるので、普通は気にしなくてもいいのだが、金額計算とかだと1えんズレても滅茶苦茶怒られるので、気をつけなければならない。

で、そういう時使うのがDecimalとか云われるデータ表現で、相当嘘をついて説明すると、数値を文字列に変換して格納するもの。0.1(10進)も"0.1"という文字列で記録するので、誤差がでない。金額計算なんかでは良く使われる子なのでした。

そんなわけで、明日からは数値計算を全部Decimalに書き換える作業が始まるお…。まあ、それはいいんだけど、JAVAとかだと

  bdHoge.multiply( bdHuga ).subtract( bdPiyo );

とか書くのスゲーうざいよなー。見て判ンねーよ。

  bdHoge * bdHuga - bdPiyo;

って素直に書きたいよなー。StringBufferとかも.apend("foo").append("bar")とか繋げていくのが面倒でつい+で文字列結合しちゃうよ。。。そこはホントなんとかして欲しい。

そこをいくとC++には「演算子オーバーロード」つうウルトラ超必殺技があるわけなんだが…。こんなもん実装してるのC++くらいしか聞いたことないけど他にあるのかな?

  objFoo + 1;

って書かれるだけで、そこで何が行われても不思議じゃないと云うのは確かに狂った仕様ですな(演算子オーバーロードをすることで、"+"と云う演算子に別の機能が付与できる。減算をすることにしてもいいしw、もっとスゴイ処理が行われる可能性も否めない)。みんな懲りて後続の言語ではオミットされてるのかもしれんですね。でもさ、Decimal同士の四則演算だったらさ、bdHoge.Add(bdHuga)なんて書くよりbdHoge + bdHugaって書く方がはるかに自然なわけですし、文字列も"+"で結合できたら便利じゃないすか。

そんなわけで、使い方を誤ると滅茶苦茶なことになりかねないけど、ここぞと云う時に使いどころに注意して使うとスゲー便利にできるC++は素敵だなぁ。と。まあ、別段目新しい主張じゃないんだけどさ。(みんな大好きD言語もこのへん上手いこと取り入れてるのかもしれない)