2011年3月11日金曜日

最近接偶数丸め

最近接偶数丸め(round to the nearest even; RN)は、端数が0.5より小さいなら切り捨て、端数が0.5よりおおきいならば切り上げる。端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める。

偶数となる方へ丸める理由:丸めによる誤差が小さいため
①小数点以下2桁の2進数に、0捨1入して「1」となる数とその合計
[1.00],[1.01],[0.11],[0.10] → 左の合計[11.10(3.5)]
②最近接偶数丸めの場合の「1」となる数とその合計
[1.00][1.01][0.11] → 左の合計[11.00(3.0)]

②の場合丸めを行う前と後では結果が同じになる。
以上のことから、最近接偶数丸めは誤差が小さいと言える。

2011年3月10日木曜日

typeidをテスト以外で使うのは勧めない

typeidは実行時型認識(RTTI)のためのオペレータです。
typeidオペレータはポインタまたは参照が指すオブジェクトの実際の型を返します。
が、、、
オブジェクト指向プログラミングを徹底した場合、typeidを使う必要はありません。
実際の型を判定に使わなくても、C++のポリモーフィズムを用いて動的に処理を変えることが可能です。
むしろ、typeidを許してしまうと(オブジェクト指向が徹底されず)ソースが腐ってしまう可能性が高くなってしまいます。
「割れ窓理論」からtypeidを実装では使わない方がいいでしょう、たぶん。

だけど、テストの場合は別です。
オブジェクトが所望の型に変換されているか確認する場合などは、typeidを使い型のテストができます。Unitテストは全体のコードに対して影響範囲も少ないので、テストのみtypeidを許す方がいいと思います(僕の職場ではそうしています)。

ということで、
typeidをテスト以外で使うのはお勧めしません。以上です。
*RTTIのもう一つのオペレータdynamic_castでも型のテストができます。

2011年3月8日火曜日

ビットオペレータは整数型のオペランドをとる

ビットオペレータは整数型のオペランドをとる。
従って、浮動小数点(ex:float double)では使えない。

整数型:http://ja.wikipedia.org/wiki/%E6%95%B4%E6%95%B0%E5%9E%8B

考えてみると、浮動小数点は符号部・指数部・仮数部に別れて値を表す。
(できないが)ビットシフトした場合、指数部の値までも変わることになるので、意図しない動くのは自明である。