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 0
ve 0 + epsilon
ile temsil edilebilen sayılar var double
mı?
Değilse, karşılaştırma karşılaştırma ile eşdeğer değil someValue == 0.0
mi?
numeric_limits<>::epsilon
yanı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.