ฉันเป็นสมาชิกของคณะกรรมการ IEEE-754 ฉันจะพยายามช่วยอธิบายให้ชัดเจน
ก่อนอื่นตัวเลขทศนิยมไม่ได้เป็นตัวเลขจริงและเลขทศนิยมนั้นไม่ตรงกับความจริงของเลขคณิตจริง Trichotomy ไม่ได้เป็นคุณสมบัติเฉพาะของเลขคณิตจริงที่ไม่ได้ถือไว้เพื่อการลอยตัวหรือแม้แต่สิ่งที่สำคัญที่สุด ตัวอย่างเช่น:
- นอกจากนี้ไม่ได้เชื่อมโยง
- กฎหมายการกระจายสินค้าไม่ได้ถือ
- มีจำนวนจุดลอยตัวโดยไม่ต้องผกผัน
ฉันสามารถไปต่อ มันไม่ได้เป็นไปได้ที่จะระบุขนาดคงที่ประเภทการทางคณิตศาสตร์ที่น่าพอใจทั้งหมดของคุณสมบัติของเลขคณิตจริงที่เรารู้และความรัก คณะกรรมการ 754 ต้องตัดสินใจที่จะงอหรือทำลายบางส่วน นี่เป็นแนวทางโดยหลักการง่ายๆ
- เมื่อเราทำได้เราจะจับคู่พฤติกรรมของเลขคณิตจริง
- เมื่อเราทำไม่ได้เราจะพยายามทำการละเมิดให้สามารถคาดการณ์ได้และง่ายต่อการวินิจฉัยมากที่สุด
เกี่ยวกับความคิดเห็นของคุณ "ซึ่งไม่ได้หมายความว่าคำตอบที่ถูกต้องเป็นเท็จ" นี่เป็นสิ่งที่ผิด เพรดิเคต(y < x)
ถามว่าy
น้อยกว่าx
หรือไม่ ถ้าy
เป็น NaN แสดงว่าไม่น้อยกว่าค่าเลขทศนิยมใด ๆx
ดังนั้นคำตอบจึงเป็นเท็จ
ฉันพูดถึงว่า trichotomy ไม่ถือค่าทศนิยม อย่างไรก็ตามมีคุณสมบัติที่คล้ายกันที่จะถือเป็น ข้อ 5.11 วรรค 2 ของมาตรฐาน 754-2008:
ความสัมพันธ์แบบเอกสิทธิ์เฉพาะบุคคลทั้งสี่มีความเป็นไปได้: น้อยกว่า, เท่ากัน, มากกว่า, และไม่ได้เรียงลำดับ กรณีสุดท้ายเกิดขึ้นเมื่อตัวถูกดำเนินการอย่างน้อยหนึ่งตัวคือ NaN NaN ทุกคนจะเปรียบเทียบกับทุกสิ่งที่ไม่เรียงลำดับรวมถึงตัวมันเอง
เท่าที่การเขียนโค้ดพิเศษเพื่อจัดการกับ NaNs นั้นเป็นไปได้โดยทั่วไป (แม้ว่าจะไม่ใช่เรื่องง่ายเสมอไป) ในการจัดโครงสร้างโค้ดของคุณในแบบที่ NaN ล้มลงอย่างถูกต้อง แต่ก็ไม่ได้เป็นเช่นนั้นเสมอไป เมื่อไม่มีรหัสพิเศษบางอย่างอาจจำเป็น แต่เป็นราคาเล็ก ๆ ที่จ่ายเพื่อความสะดวกในการปิดพีชคณิตที่นำไปสู่การคำนวณเลขทศนิยม
ภาคผนวก: ผู้แสดงความคิดเห็นหลายคนแย้งว่ามันจะมีประโยชน์มากขึ้นในการรักษาความสะท้อนของความเสมอภาคและ trichotomy บนพื้นที่ที่ใช้ NaN! = NaN ดูเหมือนจะไม่รักษาความจริงที่คุ้นเคย ฉันยอมรับว่ามีความเห็นอกเห็นใจต่อมุมมองนี้ดังนั้นฉันคิดว่าฉันจะทบทวนคำตอบนี้อีกครั้งและให้บริบทเพิ่มเติมอีกเล็กน้อย
ความเข้าใจของฉันจากการพูดคุยกับ Kahan คือ NaN! = NaN มีต้นกำเนิดมาจากการพิจารณาเชิงปฏิบัติสองประการ:
ที่x == y
ควรจะเทียบเท่าx - y == 0
เมื่อใดก็ตามที่เป็นไปได้ (นอกเหนือจากทฤษฎีบทของเลขคณิตจริงแล้วสิ่งนี้ทำให้การใช้งานฮาร์ดแวร์เปรียบเทียบพื้นที่ที่มีประสิทธิภาพมากขึ้นซึ่งมีความสำคัญสูงสุดในเวลาที่มาตรฐานได้รับการพัฒนา - หมายเหตุอย่างไรก็ตามนี่เป็นการละเมิด x y = = อินฟินิตี้, ดังนั้นมันจึงไม่ได้เป็นเหตุผลที่ดีในตัวของมันเองก็จะได้รับพอสมควรงอไป(x - y == 0) or (x and y are both NaN)
)
ที่สำคัญกว่านั้นไม่มีisnan( )
คำกริยาในช่วงเวลาที่ NaN ถูกทำให้เป็นทางการในคณิตศาสตร์ 8087; มันจำเป็นที่จะต้องให้โปรแกรมเมอร์ด้วยวิธีการที่สะดวกและมีประสิทธิภาพในการตรวจสอบค่า NaN ที่ไม่ได้ขึ้นอยู่กับภาษาการเขียนโปรแกรมที่ให้สิ่งisnan( )
ที่อาจใช้เวลาหลายปี ฉันจะอ้างอิงการเขียนของตัวเอง Kahan ในเรื่อง:
หากไม่มีวิธีที่จะกำจัด NaNs พวกเขาจะไร้ประโยชน์เหมือนคน Indefinites บน CRAYs ทันทีที่มีใครพบการคำนวณจะดีที่สุดแทนที่จะหยุดต่อไปเป็นเวลาไม่สิ้นสุดเพื่อหาข้อสรุปที่ไม่มีกำหนด นั่นคือเหตุผลที่การดำเนินการบางอย่างกับ NaN ต้องส่งผลลัพธ์ที่ไม่ใช่ของ NaN การดำเนินการใด …ข้อยกเว้นคือ C predicates“ x == x” และ“ x! = x”, ซึ่งเป็นลำดับที่ 1 และ 0 สำหรับทุกอนันต์หรือจำนวน จำกัด x แต่กลับกันถ้า x ไม่ใช่ตัวเลข (NaN); สิ่งเหล่านี้ให้ความแตกต่างอย่างง่าย ๆ เพียงอย่างเดียวระหว่าง NaN กับตัวเลขในภาษาที่ไม่มีคำว่า NaN และภาคแสดง IsNaN (x)
โปรดทราบว่านี่เป็นตรรกะที่ออกกฎการส่งคืนบางสิ่งเช่น "Not-A-Boolean" บางทีลัทธินิยมนิยมนี้ถูกใส่ผิดที่และมาตรฐานควรจำเป็นisnan( )
แต่นั่นทำให้ NaN แทบจะเป็นไปไม่ได้ที่จะใช้งานได้อย่างมีประสิทธิภาพและสะดวกสบายเป็นเวลาหลายปีในขณะที่โลกรอการยอมรับภาษาโปรแกรม ฉันไม่มั่นใจว่าจะเป็นการแลกเปลี่ยนที่สมเหตุสมผล
เป็นทื่อ: ผลลัพธ์ของ NaN == NaN จะไม่เปลี่ยนแปลงในขณะนี้ ดีกว่าที่จะเรียนรู้ที่จะอยู่กับมันมากกว่าที่จะบ่นบนอินเทอร์เน็ต หากคุณต้องการยืนยันว่าควรมีความสัมพันธ์กับคำสั่งซื้อที่เหมาะสมกับคอนเทนเนอร์ด้วยฉันขอแนะนำให้สนับสนุนให้ภาษาโปรแกรมที่คุณโปรดปรานใช้ภาคtotalOrder
แสดงที่ได้มาตรฐานใน IEEE-754 (2008) ความจริงที่ว่ามันยังไม่ได้พูดถึงความถูกต้องของความกังวลของ Kahan ที่กระตุ้นให้เกิดสถานะของกิจการในปัจจุบัน
while (fabs(x - oldX) > threshold)
ออกจากลูปหากการบรรจบเกิดขึ้นหรือ NaN เข้าสู่การคำนวณ การตรวจหา NaN และวิธีการรักษาที่เหมาะสมนั้นจะเกิดขึ้นนอกวง