[#43103] 浮動小数点を比較するには — wada toshiki <wada-ts@...>

お世話になります。

21 messages 2007/01/11
[#43105] Re: 浮動小数点を比較するには — NISHIMATSU Takeshi <t_nissie@...> 2007/01/11

> Rubyレシピブック(P290)で 比較する数値の差を Float::EPSILON と比較する方法があり

[ruby-list:43124] Re: 浮動小数点を比較するには

From: NISHIMATSU Takeshi <t_nissie@...>
Date: 2007-01-15 02:13:10 UTC
List: ruby-list #43124
はじめにいいかげんな回答をした西松です。

> > 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だとレジスタ間の演算は拡張精度で行われるので、
# 予想以上に精度がよくなったり, 丸めかたが特殊だったりします。

-- 西松タケシ




In This Thread