ฉันมีโมเดลขนาดใหญ่ (~ 5,000 บรรทัด) เขียนด้วย C มันเป็นโปรแกรมอนุกรมที่ไม่มีการสร้างหมายเลขสุ่มใด ๆ มันใช้ไลบรารี FFTW สำหรับฟังก์ชั่นที่ใช้ FFT - ฉันไม่ทราบรายละเอียดของการใช้งาน FFTW แต่ฉันคิดว่าฟังก์ชั่นในนั้นนั้นถูกกำหนดไว้ด้วย (แก้ไขฉันถ้าฉันผิด)
ปัญหาที่ฉันไม่เข้าใจคือฉันได้รับความแตกต่างเล็กน้อยในผลลัพธ์สำหรับการทำงานที่เหมือนกันในเครื่องเดียวกัน (คอมไพเลอร์เดียวกันไลบรารีเดียวกัน)
ฉันใช้ตัวแปรความแม่นยำสองเท่าและเพื่อผลลัพธ์ผลลัพธ์ในตัวแปรvalue
เช่นฉันออก:
fprintf(outFID, "%.15e\n", value);
หรือ
fwrite(&value, 1, sizeof(double), outFID);
และฉันจะได้รับความแตกต่างอย่างต่อเนื่องเช่น:
2.07843469652206 4 e-16 กับ 2.07843469652206 3 e-16
ฉันใช้เวลามากในการพยายามหาสาเหตุว่าทำไม ตอนแรกฉันคิดว่าชิปหน่วยความจำตัวหนึ่งของฉันเสียไปแล้วและฉันก็สั่งและเปลี่ยนมันให้เป็นประโยชน์ ต่อมาฉันก็ลองรันโค้ดของฉันบนเครื่อง Linux ของเพื่อนร่วมงานและฉันก็มีความแตกต่างในลักษณะเดียวกัน
สิ่งใดที่ทำให้เกิดสิ่งนี้ มันเป็นปัญหาเล็ก ๆ ในตอนนี้ แต่ฉันสงสัยว่ามันเป็น "เคล็ดลับของภูเขาน้ำแข็ง" (ของปัญหาร้ายแรง)
ฉันคิดว่าฉันจะโพสต์ที่นี่แทน StackOverflow ในกรณีที่มีคนทำงานกับแบบจำลองตัวเลขอาจเจอปัญหานี้ หากใครสามารถทำให้กระจ่างเกี่ยวกับเรื่องนี้ฉันจะต้องรับผิดชอบมาก
ติดตามความคิดเห็น:
Christian Clason และ Vikram: ก่อนอื่นขอขอบคุณสำหรับความสนใจในคำถามของฉัน บทความที่คุณเชื่อมโยงเพื่อแนะนำว่า: 1. ข้อผิดพลาดในการปัดเศษจำกัดความถูกต้องและ 2. รหัสอื่น (เช่นการแนะนำคำสั่งการพิมพ์ที่ไม่เป็นอันตราย) อาจส่งผลต่อผลลัพธ์ถึงเครื่อง epsilon ฉันควรชี้แจงว่าฉันไม่ได้เปรียบเทียบผลกระทบfwrite
และfprintf
ฟังก์ชั่น ฉันใช้อันใดอันหนึ่ง โดยเฉพาะอย่างยิ่งปฏิบัติการที่เหมือนกันนั้นถูกใช้สำหรับการรันทั้งคู่ ฉันเพียงแค่การระบุปัญหาเกิดขึ้นไม่ว่าจะเป็นผมใช้หรือfprintf
fwrite
ดังนั้นเส้นทางรหัส (และปฏิบัติการ) เหมือนกันและฮาร์ดแวร์เหมือนกัน ด้วยปัจจัยภายนอกทั้งหมดเหล่านี้มีค่าคงที่แบบแผนมาจากไหน? ฉันสงสัยว่าการพลิกบิตเกิดขึ้นเนื่องจากหน่วยความจำผิดพลาดที่ไม่ได้รับการเก็บรักษาอย่างถูกต้องซึ่งเป็นเหตุผลที่ฉันเปลี่ยนชิปหน่วยความจำ แต่ดูเหมือนว่าจะไม่เป็นปัญหาที่นี่ฉันยืนยันและคุณระบุ โปรแกรมของฉันแสดงผลตัวเลขความแม่นยำสองเท่านับพันในการเรียกใช้ครั้งเดียวและมีสุ่มจำนวนหนึ่งที่สุ่มบิตพลิก
การติดตาม # 2 :
นี่เป็นโครงเรื่องของอนุกรมเวลาเอาท์พุทโดยรูปแบบเพื่อช่วยในการอภิปราย offshoot ในความคิดเห็น