Bugün, (başka biri tarafından yazılmış) bazı C ++ kodu bakıyordu ve bu bölümü bulundu:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Bunun mantıklı olup olmadığını anlamaya çalışıyorum.
İçin belgeler epsilon()diyor:
İşlev 1 ile 1'den büyük olan [bir çiftle] temsil edilebilen en küçük değer arasındaki farkı döndürür.
Bu 0 için de geçerli mi, yani epsilon()en küçük değer 0'dan büyük mü? Yoksa arasında 0ve 0 + epsilonile temsil edilebilen sayılar var doublemı?
Değilse, karşılaştırma karşılaştırma ile eşdeğer değil someValue == 0.0mi?
numeric_limits<>::epsilonyanıltıcı ve önemsizdir. İstediğimiz şey, gerçek değer 0'dan 0'dan biraz daha fazla değilse 0 varsaymaktır. Ve ε, makineye bağlı bir değere göre değil, sorun spesifikasyonuna göre seçilmelidir. Şu anki epsilonun işe yaramaz olduğundan şüpheliyim, çünkü birkaç FP operasyonu bile bundan daha büyük bir hata biriktirebilir.