From: NISHIMATSU Takeshi Date: 2007-01-15T11:13:10+09:00 Subject: [ruby-list:43124] Re: 浮動小数点を比較するには はじめにいいかげんな回答をした西松です。 > > http://boost.cppll.jp/HEAD/libs/test/doc/floating_point_comparison.htm > > これを参考にすると、 > > class Float > def near_to(b) > (self - b).abs / abs <= Float::EPSILON && > (b - self).abs / b.abs <= Float::EPSILON > end > end > > こういう感じでしょうか。 これを、 x = 0.0; 19.times{ x += 0.1 } p 1.9.near_to(x) のような比較に使うのはやばい気がします。誤差が累積するからです。 比較の目的に沿う範囲で「許容値」をFloat::EPSILON*100とか0.00001とかにすればよいです。 # 浮動小数点数の話はほんとやっかいですね。 # IntelのCPUだとレジスタ間の演算は拡張精度で行われるので、 # 予想以上に精度がよくなったり, 丸めかたが特殊だったりします。 -- 西松タケシ