Hari ini, saya melihat-lihat beberapa kode C ++ (ditulis oleh orang lain) dan menemukan bagian ini:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Saya mencoba mencari tahu apakah ini masuk akal.
Dokumentasi untuk epsilon()
mengatakan:
Fungsi mengembalikan selisih antara 1 dan nilai terkecil lebih besar dari 1 yang dapat direpresentasikan [oleh gandakan].
Apakah ini berlaku untuk 0 juga, yaitu epsilon()
apakah nilai terkecil lebih besar dari 0? Atau adakah angka antara 0
dan 0 + epsilon
yang dapat diwakili oleh a double
?
Jika tidak, bukankah perbandingannya setara dengan someValue == 0.0
?
numeric_limits<>::epsilon
menyesatkan dan tidak relevan. Yang kita inginkan adalah mengasumsikan 0 jika nilai aktual berbeda tidak lebih dari beberapa ε dari 0. Dan ε harus dipilih berdasarkan spesifikasi masalah, bukan pada nilai yang tergantung pada mesin. Saya menduga bahwa epsilon saat ini tidak berguna, karena bahkan hanya beberapa operasi FP dapat mengakumulasi kesalahan yang lebih besar dari itu.