มีความท้าทายทางเทคนิคมากมายที่ทำให้การทำซ้ำผลบิตต่อบิตที่แน่นอนของผลการคำนวณทำได้ยากมาก
ในระดับซอฟต์แวร์การเปลี่ยนแปลงรหัสหรือไลบรารีใด ๆ ที่ใช้งานโดยรหัสสามารถทำให้ผลลัพธ์ต่างกันได้ คุณจะประหลาดใจกับจำนวนไลบรารีสนับสนุนที่สามารถเชื่อมโยงกับโค้ดทางวิทยาศาสตร์ทั่วไป
ในระดับที่ต่ำกว่าการคอมไพล์โค้ดหรือไลบรารี่ใด ๆ ที่ใช้โดยโค้ดด้วยคอมไพเลอร์ใหม่หรือเปิดออปชั่นคอมไพเลอร์ที่แตกต่างกันอาจทำให้เกิดปัญหาได้ เหตุผลหนึ่งคือการดำเนินการต่าง ๆ ในรหัสอาจถูกดำเนินการในลำดับที่แตกต่างกันเมื่อมีการคอมไพล์รหัสใหม่ เนื่องจากการเพิ่มจุดลอยตัวนั้นไม่ได้เชื่อมโยง (a + b) + c <> a + (b + c) สิ่งนี้สามารถให้ผลลัพธ์ที่แตกต่างกัน
ตกลงดังนั้นถ้าเรารักษาสภาพแวดล้อมซอฟต์แวร์ทั้งหมด (OS, ไลบรารีและรหัสที่คอมไพล์) โดย (เช่น) เขียนลงบน CD-Rom ที่สามารถบูตได้ซึ่งจะเรียกใช้รหัส ตอนนี้เรามั่นใจได้หรือไม่ว่าเราจะได้ผลลัพธ์เดียวกันหากเราเรียกใช้รหัสนี้ในคอมพิวเตอร์เครื่องอื่น
น่าแปลกที่บางรหัสแตกต่างกันไปตามลำดับของการคำนวณตามลักษณะของโปรเซสเซอร์รุ่นใดที่กำลังทำงานอยู่ ตัวอย่างเช่นไลบรารี่พีชคณิตเชิงเส้นที่ดีที่สุดมักจะแบ่งการคูณเมทริกซ์เพื่อทำงานในบล็อกที่จะพอดีกับแคช เมื่อ Intel เปิดตัวไมโครโปรเซสเซอร์ใหม่พร้อมแคชที่ใหญ่กว่ารหัสอาจปรับขนาดบล็อกแบบไดนามิกส่งผลให้เลขคณิตที่ดำเนินการตามลำดับที่แตกต่างกันและให้ผลลัพธ์ที่แตกต่างกัน รหัสอื่น ๆ ปรับลำดับการคำนวณแบบไดนามิกตามจำนวนหน่วยความจำที่มีอยู่หากคุณเรียกใช้รหัสบนคอมพิวเตอร์ที่มีหน่วยความจำมากขึ้นซึ่งอาจทำให้การคำนวณทางคณิตศาสตร์ในลำดับอื่นแตกต่างกันและทำให้ได้ผลลัพธ์ที่แตกต่างกัน
สิ่งต่าง ๆ มีความซับซ้อนยิ่งขึ้นอย่างน่าประหลาดใจเมื่อคุณใส่รหัสแบบมัลติเธรดเนื่องจากประวัติการดำเนินการที่แน่นอนของเธรดที่แตกต่างกันนั้นมักจะไม่ได้กำหนดไว้ล่วงหน้าและสิ่งนี้อาจทำให้การดำเนินการทางคณิตศาสตร์อีกครั้ง
ในทางปฏิบัติสิ่งที่คุณคาดหวังได้มากที่สุดคือผลลัพธ์ที่คล้ายกันจากเครื่องหนึ่งไปยังเครื่องถัดไปขึ้นอยู่กับความคลาดเคลื่อนที่แม่นยำของอัลกอริทึมที่ใช้ เช่นถ้าฉันมีปัญหาในการค้นหารูทและใช้ bisection เพื่อรับรูตภายใน + -1.0e-10 ดังนั้นฉันควรจะมีความสุขตราบใดที่เครื่องจักรต่าง ๆ สร้างคำตอบที่เห็นด้วยกับการยอมรับนั้น