浮動小数の比較の実装
一つ前のエントリ: http://d.hatena.ne.jp/saiya_moebius/20090111/1231669765 「float と 80bit FPU」
参考: ��ư�������������� (Boost の close_at_tolerance についてのドキュメント)
浮動小数な値同士を比較することについて、Boost のドキュメントに ��ư�������������� という興味深いドキュメントがあることを発見したのでメモ。
Boost のドキュメントにある小数の比較について、私なりきに要約
元となっている参考文献が今手元にないので難だが、とりあえず Boost のドキュメントだけから読み取れた内容をまとめてみた。The art of computer programming をまともに読むべきにかも、こりゃ。
実装してみた
そこで、Source | SVN | Assembla にて C# で実装してみた。
実装の内容は、上に書いてある内容を boost/test/floating_point_comparison.hpp - 1.37.0 を見ながら実装したものである。
IComparer
1f.EqualsTolerant(1f + float.Epsilon, 32);
のようにも使うことが出来る。
なお、この C# 実装では、IComparer
, , という風に同値関係を延々と並べて見ると分かるが、誤差を許容する Equals を実装する場合、あらゆる値に対する HashCode を同じ値にしなくてはならなくなってしまい、意味をなさない実装になってしまうのである。
なお、上の記述を見ても分かるとおり、この IComparer
半順序であっても、MSDN の IComparer