ภูมิปัญญาทั่วไปที่ตัวเลขทศนิยมไม่สามารถนำมาเปรียบเทียบเพื่อความเท่าเทียมกันได้ไม่ถูกต้อง จำนวนจุดลอยตัวไม่แตกต่างจากจำนวนเต็ม: ถ้าคุณประเมิน "a == b" คุณจะได้รับจริงถ้าพวกเขาเป็นตัวเลขที่เหมือนกันและเป็นเท็จอย่างอื่น (ด้วยความเข้าใจว่าแน่นอนว่า NaN สองตัวนั้นไม่เหมือนกัน)
ปัญหาที่แท้จริงคือ: ถ้าฉันทำการคำนวณบางอย่างแล้วและไม่แน่ใจว่าตัวเลขสองตัวที่ฉันต้องเปรียบเทียบนั้นถูกต้องตรงไหนแล้วอะไรล่ะ? ปัญหานี้เหมือนกันสำหรับเลขทศนิยมเนื่องจากเป็นจำนวนเต็ม หากคุณประเมินค่านิพจน์จำนวนเต็ม "7/3 * 3" จะไม่เปรียบเทียบเท่ากับ "7 * 3/3"
สมมติว่าเราถามว่า "ฉันจะเปรียบเทียบจำนวนเต็มกับความเท่าเทียมได้อย่างไร" ในสถานการณ์เช่นนี้ ไม่มีคำตอบเดียว; สิ่งที่คุณควรทำขึ้นอยู่กับสถานการณ์ที่เฉพาะเจาะจงโดยเฉพาะอย่างยิ่งข้อผิดพลาดที่คุณมีและสิ่งที่คุณต้องการบรรลุ
นี่เป็นตัวเลือกที่เป็นไปได้
หากคุณต้องการได้ผลลัพธ์ที่ "จริง" หากตัวเลขที่แน่นอนทางคณิตศาสตร์จะเท่ากันคุณอาจลองใช้คุณสมบัติของการคำนวณที่คุณดำเนินการเพื่อพิสูจน์ว่าคุณได้รับข้อผิดพลาดเดียวกันในสองตัวเลข หากเป็นไปได้และคุณเปรียบเทียบสองตัวเลขที่เป็นผลมาจากนิพจน์ที่จะให้ตัวเลขที่เท่ากันหากคำนวณให้ถูกต้องคุณจะได้รับ "ความจริง" จากการเปรียบเทียบ อีกวิธีหนึ่งคือคุณอาจวิเคราะห์คุณสมบัติของการคำนวณและพิสูจน์ว่าข้อผิดพลาดไม่เกินจำนวนที่แน่นอนบางทีอาจเป็นจำนวนที่แน่นอนหรือจำนวนที่สัมพันธ์กับหนึ่งในอินพุตหรือหนึ่งในเอาต์พุต ในกรณีดังกล่าวคุณสามารถถามได้ว่าตัวเลขที่คำนวณสองตัวนั้นแตกต่างกันตามจำนวนเงินนั้นมากที่สุดหรือไม่และส่งคืน "จริง" หากอยู่ภายในช่วงเวลานั้น หากคุณไม่สามารถพิสูจน์ข้อผิดพลาดได้ คุณอาจคาดเดาและหวังในสิ่งที่ดีที่สุด วิธีหนึ่งในการคาดเดาคือการประเมินตัวอย่างสุ่มจำนวนมากและดูการกระจายที่คุณได้รับในผลลัพธ์
แน่นอนเนื่องจากเราตั้งข้อกำหนดที่คุณจะได้รับ "จริง" เท่านั้นหากผลลัพธ์ที่แน่นอนทางคณิตศาสตร์เท่ากันเราจึงเปิดโอกาสที่คุณจะได้รับ "จริง" แม้ว่าพวกเขาจะไม่เท่ากัน (อันที่จริงแล้วเราสามารถตอบสนองความต้องการโดยการส่งกลับ "จริง" เสมอซึ่งทำให้การคำนวณง่าย แต่โดยทั่วไปไม่พึงประสงค์ดังนั้นฉันจะหารือเกี่ยวกับการปรับปรุงสถานการณ์ด้านล่าง)
หากคุณต้องการได้ผลลัพธ์ที่ "ผิดพลาด" หากตัวเลขที่แน่นอนทางคณิตศาสตร์นั้นไม่เท่ากันคุณต้องพิสูจน์ว่าการประเมินตัวเลขของคุณให้ตัวเลขที่แตกต่างกันหากตัวเลขที่แน่นอนทางคณิตศาสตร์นั้นไม่เท่ากัน สิ่งนี้อาจเป็นไปไม่ได้สำหรับการใช้งานจริงในสถานการณ์ทั่วไปมากมาย ดังนั้นให้เราพิจารณาทางเลือกอื่น
ข้อกำหนดที่มีประโยชน์อาจเป็นได้ว่าเราได้ผลลัพธ์เป็น "เท็จ" หากตัวเลขที่แน่นอนทางคณิตศาสตร์แตกต่างกันมากกว่าจำนวนที่แน่นอน ตัวอย่างเช่นเราอาจจะคำนวณว่าลูกบอลถูกโยนในเกมคอมพิวเตอร์ที่เดินทางไปหรือไม่และเราต้องการทราบว่าลูกบอลดังกล่าวกระทบหรือไม่ ในกรณีนี้เราต้องการได้รับ "จริง" อย่างแน่นอนหากลูกบอลกระทบกับค้างคาวและเราต้องการได้รับ "เท็จ" ถ้าลูกบอลอยู่ไกลจากค้างคาวและเราสามารถยอมรับคำตอบที่ "ไม่จริง" ถ้าลูกบอลใน การจำลองที่แม่นยำทางคณิตศาสตร์พลาดการตีไม้ แต่อยู่ในระยะมิลลิเมตรของการตีไม้ตี ในกรณีนี้เราต้องพิสูจน์ (หรือคาดเดา / ประมาณ) ว่าการคำนวณตำแหน่งลูกบอลและตำแหน่งค้างคาวของเรามีข้อผิดพลาดรวมกันอย่างน้อยหนึ่งมิลลิเมตร (สำหรับตำแหน่งที่สนใจทั้งหมด) สิ่งนี้จะทำให้เรากลับมาเสมอ "
ดังนั้นวิธีที่คุณตัดสินใจว่าจะกลับมาอย่างไรเมื่อเปรียบเทียบจำนวนจุดลอยตัวนั้นขึ้นอยู่กับสถานการณ์ของคุณเป็นอย่างมาก
สำหรับวิธีการพิสูจน์ขอบเขตข้อผิดพลาดในการคำนวณซึ่งอาจเป็นเรื่องที่ซับซ้อน การนำไปใช้งานแบบ floating-point ใด ๆ ที่ใช้มาตรฐาน IEEE 754 ในโหมดการปัดเศษไปยังที่ใกล้ที่สุดจะส่งกลับตัวเลข floating-point ที่ใกล้เคียงกับผลลัพธ์ที่แน่นอนที่สุดสำหรับการดำเนินการพื้นฐานใด ๆ (โดยเฉพาะการคูณการหารการบวกการลบรากที่สอง) (ในกรณีที่มีความเสมอกันให้ปัดเศษให้มีค่าบิตต่ำ) (โปรดระมัดระวังเป็นพิเศษเกี่ยวกับสแควร์รูทและการหารการใช้ภาษาของคุณอาจใช้วิธีที่ไม่สอดคล้องกับมาตรฐาน IEEE 754 สำหรับสิ่งเหล่านี้) เนื่องจากข้อกำหนดนี้ ข้อผิดพลาดในผลลัพธ์เดียวมีค่าอย่างน้อยที่สุด 1/2 ของค่าบิตที่มีนัยสำคัญน้อยที่สุด (ถ้ามีมากขึ้นการปัดเศษจะเป็นจำนวนที่ต่างกันซึ่งอยู่ภายใน 1/2 ของค่า)
จากที่นั่นไปก็ยิ่งซับซ้อนมากขึ้น ขั้นตอนต่อไปคือการดำเนินการที่หนึ่งในอินพุตมีข้อผิดพลาดอยู่แล้ว สำหรับนิพจน์อย่างง่ายข้อผิดพลาดเหล่านี้สามารถติดตามได้ผ่านการคำนวณเพื่อให้ถึงขอบเขตของข้อผิดพลาดสุดท้าย ในทางปฏิบัติสิ่งนี้ทำได้ในบางสถานการณ์เท่านั้นเช่นการทำงานในห้องสมุดคณิตศาสตร์ที่มีคุณภาพสูง และแน่นอนคุณต้องมีการควบคุมที่แม่นยำว่าการดำเนินการใดถูกต้อง ภาษาระดับสูงมักจะทำให้คอมไพเลอร์หย่อนมากดังนั้นคุณอาจไม่รู้ว่าการดำเนินการตามลำดับนั้นดำเนินการอย่างไร
มีอีกมากที่สามารถเขียนได้ (และ) เกี่ยวกับหัวข้อนี้ แต่ฉันต้องหยุดตรงนั้น โดยสรุปคำตอบคือ: ไม่มีรูทีนไลบรารีสำหรับการเปรียบเทียบนี้เนื่องจากไม่มีโซลูชันเดียวที่เหมาะกับความต้องการส่วนใหญ่ที่ควรใส่ลงในรูทีนไลบรารี (หากเปรียบเทียบกับช่วงเวลาข้อผิดพลาดแบบสัมพัทธ์หรือสัมบูรณ์สำหรับคุณคุณสามารถทำได้โดยไม่ต้องมีไลบรารีรูทีน)