คำถามติดแท็ก floating-point

วิธีการแทนตัวเลขด้วยเลขนัยสำคัญคงที่และเลขชี้กำลังของเลขฐานบางตัว พวกเขามีลักษณะเฉพาะในรูปแบบ (sผมก.nผมผมanเสื้อdผมก.ผมเสื้อs)* * * *asอีอีxพีโอnอีnเสื้อ. โดยปกติตัวเลขจะแสดงด้วยฐาน = 2 (ไบนารี)

4
ผลลัพธ์เล็ก ๆ ที่คาดเดาไม่ได้ในการรันโมเดลที่กำหนดไว้
ฉันมีโมเดลขนาดใหญ่ (~ 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 ในกรณีที่มีคนทำงานกับแบบจำลองตัวเลขอาจเจอปัญหานี้ …

1
ลำดับการดำเนินการอัลกอริธึมเชิงตัวเลข
ฉันได้อ่านแล้ว (1) การปฏิบัติที่มีเงื่อนไขควรดำเนินการก่อนที่จะมีสภาพที่ดี ตัวอย่างเช่นเราควรคำนวณเป็น( x - y ) zเนื่องจากการลบนั้นไม่ได้ถูกกำหนดเงื่อนไขในขณะที่การคูณไม่ได้x z- yZxz−yzxz-yz( x - y) z(x−y)z(x-y)z อย่างไรก็ตามการวิเคราะห์ข้อผิดพลาดลำดับแรกของอัลกอริทึมทั้งสองเผยให้เห็นว่าพวกเขาแตกต่างกันเพียงปัจจัยที่สาม (*) และฉันไม่เห็นว่าทำไมคนทั่วไปสามารถสรุปสิ่งนี้กับคำสั่ง (1) และฉันไม่เข้าใจความสำคัญของ คำสั่งของการดำเนินงาน คุณคิดว่าข้อความคือ (1) เป็นกฎที่ยอมรับได้และคุณมีคำอธิบายอื่น ๆ หรือไม่? *: โดยเฉพาะอย่างยิ่งรุ่นแรกมีข้อผิดพลาดสัมพัทธ์ที่ล้อมรอบ ในขณะที่ข้อผิดพลาดสัมพัทธ์ของรุ่นที่สองถูกล้อมรอบด้วยeps + 3 | x | + | Y|| x | - | Y|epseps+3|x|+|y||x|−|y|eps\text{eps}+3\frac{|x|+|y|}{|x|-|y|}\text{eps} 3 eps + | x | + | …

4
ความเกี่ยวข้องของการคำนวณที่มีจุดคงที่และความแม่นยำโดยพลการ
ฉันเห็นไลบรารี่ / แพ็กเกจการประมวลผลจุดลอยตัวน้อยมาก เนื่องจากความไม่ถูกต้องของการเป็นตัวแทนจุดลอยตัวคำถามเกิดขึ้นว่าทำไมมีอย่างน้อยบางฟิลด์ที่ความแม่นยำที่เพิ่มขึ้นนี้อาจคุ้มค่ากับความซับซ้อนของการทำงานกับจุดคงที่ มีปัญหาใด ๆ ในการใช้ MAJOR พูดแก้จุดเฉพาะค่าคงที่? จะช้า / เร็วไม่ถูกต้อง / แม่นยำได้อย่างไร ที่เกี่ยวข้อง: นี่และสิ่งนี้

3
การเปรียบเทียบสัมพัทธ์ของตัวเลขจำนวนจุดลอยตัว
ฉันมีฟังก์ชั่นเชิงตัวเลขf(x, y)คืนค่าจำนวนจุดลอยตัวสองเท่าที่ใช้สูตรบางอย่างและฉันต้องการตรวจสอบว่ามันถูกต้องกับนิพจน์การวิเคราะห์สำหรับการรวมกันของพารามิเตอร์ทั้งหมดxและyฉันสนใจวิธีที่เหมาะสมในการเปรียบเทียบการคำนวณและ วิเคราะห์จำนวนจุดลอยตัว? สมมติว่าทั้งสองตัวเลขและa bจนถึงตอนนี้ฉันแน่ใจแล้วว่าข้อผิดพลาดทั้งสองอย่าง ( abs(a-b) < eps) และญาติ ( abs(a-b)/max(abs(a), abs(b)) < eps) นั้นน้อยกว่า eps ด้วยวิธีนี้มันจะตรวจจับความไม่ถูกต้องของตัวเลขแม้ว่าตัวเลขจะบอกว่าประมาณ 1e-20 อย่างไรก็ตามวันนี้ฉันค้นพบปัญหาค่าตัวเลขaและค่าการวิเคราะห์bคือ: In [47]: a Out[47]: 5.9781943146790832e-322 In [48]: b Out[48]: 6.0276008792632078e-322 In [50]: abs(a-b) Out[50]: 4.9406564584124654e-324 In [52]: abs(a-b) / max(a, b) Out[52]: 0.0081967213114754103 ดังนั้นข้อผิดพลาดแบบสัมบูรณ์ [50] จึงเล็ก (ชัด) แต่ข้อผิดพลาดสัมพัทธ์ [52] นั้นใหญ่ …

2
วิธีการตั้งค่าความแม่นยำสองเท่าใน Fortran
เมื่อเร็ว ๆ นี้ฉันได้พบกับปัญหาที่แปลกประหลาดกับ FORTRAN95 ฉันเริ่มต้นตัวแปร X และ Y ดังนี้ X=1.0 Y=0.1 หลังจากนั้นฉันเพิ่มเข้าด้วยกันและพิมพ์ผลลัพธ์: 1.10000000149012 หลังจากตรวจสอบตัวแปรดูเหมือนว่า 0.1 จะไม่ถูกแสดงในความแม่นยำสองเท่าพร้อมความแม่นยำเต็มรูปแบบ มีวิธีหลีกเลี่ยงปัญหานี้หรือไม่?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.