丸め誤差対策

C/C++なら
#define D2I(a) (int)((a)*(1+1e-15))
Rubyなら
class Float
  def to_ii
    (self * (1+1.0e-6)).to_i
  end
end
puts (0.29*100).to_i
puts (0.29*100).to_ii
EPSが小さすぎて失敗したというつぶやきをいくつか見かけたが、相対的なEPSを与えることでそのようなミスを回避することができる。
とはいえ、求められる精度や値域を把握した上で、そっとEPSを足してあげる方が正しい姿勢な気がする。

(追記:2011/12/7)

どんな時にエラーが発生するのか分からない場合は、以下のrubyコードのようにして実験してみるといいかも知れません。

(1..10).each do |i|
  (i+1..10).each do |j|
    a = 0.01*i
    b = 0.01*j
    c = i*j
    d = a*b*10000
    puts "#{i} x #{j} = #{c} <-> #{d}" unless c==d
  end
end

コメント

このブログの人気の投稿

[Java] 母音か子音か

git-svnでFILE was not found in commit HASH

駄文