วันนี้ฉันดูรหัส C ++ (เขียนโดยคนอื่น) และพบส่วนนี้:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
ฉันพยายามที่จะคิดออกว่ามันทำให้รู้สึก
เอกสารสำหรับepsilon()
พูดว่า:
ฟังก์ชันส่งคืนความแตกต่างระหว่าง 1 และค่าที่น้อยที่สุดที่มากกว่า 1 ที่สามารถแทนได้ [โดย double]
สิ่งนี้นำไปใช้กับ 0 เช่นกันนั่นepsilon()
คือค่าที่เล็กที่สุดมากกว่า 0 หรือไม่ หรือมีตัวเลขระหว่าง0
และ0 + epsilon
ที่สามารถแทนด้วยdouble
?
หากไม่แสดงว่าการเปรียบเทียบนั้นไม่เทียบเท่าsomeValue == 0.0
หรือไม่
numeric_limits<>::epsilon
จะทำให้เข้าใจผิดและไม่เกี่ยวข้อง สิ่งที่เราต้องการคือการสมมติว่า 0 หากค่าจริงแตกต่างกันไม่เกิน some จาก 0 และควรเลือกตามข้อกำหนดของปัญหาไม่ใช่ค่าที่ขึ้นกับเครื่อง ฉันสงสัยว่า epsilon ปัจจุบันนั้นไร้ประโยชน์เพราะแม้แต่การปฏิบัติการ FP เพียงเล็กน้อยก็สามารถสะสมข้อผิดพลาดได้มากกว่านั้น