丸め誤差対策
C/C++なら
とはいえ、求められる精度や値域を把握した上で、そっとEPSを足してあげる方が正しい姿勢な気がする。
(追記:2011/12/7)
どんな時にエラーが発生するのか分からない場合は、以下のrubyコードのようにして実験してみるといいかも知れません。
#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_iiEPSが小さすぎて失敗したというつぶやきをいくつか見かけたが、相対的な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
コメント
コメントを投稿