丸め誤差対策
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_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
コメント
コメントを投稿