ทำไมนิพจน์ exp (i * pi) ส่งคืนผลลัพธ์ที่ผิดใน GNU Octave


8

ฉันเริ่มเรียนรู้ GNU Octave วันนี้และลองใช้นิพจน์แรกที่ให้ไว้ในคู่มือ

exp(i*pi)

ผลที่ได้คือ

ans = -1.0000e+000 + 1.2246e-016i

และดูเหมือนว่า GNU Scientific Library จะให้ผลลัพธ์ที่คล้ายกันเช่นกัน

ดังนั้นนี่คือข้อผิดพลาดของ Octave หรือปัญหาทั่วไปของซอฟต์แวร์การวิเคราะห์เชิงตัวเลข (ซอฟต์แวร์การประเมินเชิงสัญลักษณ์จะให้คำตอบที่แน่นอน)


2
ดูเหมือนว่าอ็อกเทฟมีไว้สำหรับการวิเคราะห์เชิงตัวเลข Mathematica จะให้คำตอบที่ดีกว่าแก่คุณอย่างแน่นอน ... : เพียงแค่ล้อเล่น ... ลองค้นหาวิธีการวิเคราะห์เชิงสัญลักษณ์ของ GNU
gd1

@Giacomo: ฉันรู้ว่า ฉันแค่สงสัยว่าซอฟต์แวร์การวิเคราะห์เชิงตัวเลขทั้งหมดประเมินว่าเป็นจำนวนดังกล่าวหรือเพียงแค่ GNU Octave
Siyuan Ren

@Karsus Ren นี่ไม่ใช่ข้อผิดพลาดซอฟต์แวร์จริงๆ แต่เป็นฮาร์ดแวร์ เป็นข้อ จำกัด โดยธรรมชาติของการพยายามประเมินนิพจน์ด้วยตัวเลขที่ไม่มีเหตุผลบนฮาร์ดแวร์ที่มีพื้นที่เก็บข้อมูลจำนวน จำกัด สำหรับตัวเลขเดียว
พัฒนา

คำตอบ:


8

นี่ไม่ใช่ข้อผิดพลาดอย่างใดอย่างหนึ่ง แต่เนื่องจากวิธีการที่คอมพิวเตอร์ดำเนินการกับจุดลอยตัว คอมพิวเตอร์ของคุณสามารถใช้งานได้อย่างแม่นยำด้วยจำนวน จำกัด ดังนั้นบางครั้งคุณจะเห็นความผิดปกติเช่นนี้ แม้ว่ามันจะเป็นไปได้ที่จะเขียนซอฟต์แวร์ที่สามารถจัดการสิ่งนี้ได้ แต่ก็ต้องใช้เวลาในการคำนวณมากขึ้นและเพิ่มความต้องการหน่วยความจำอย่างมาก

หากคุณดูมัน e ^ (i * pi) จะส่งกลับค่า -1 + 1.2x10 ^ -16i อย่างที่คุณเห็นส่วนประกอบจินตภาพนั้นมีขนาดเล็กมาก (ส่วนใหญ่จะพิจารณาว่ามันเล็กน้อยมากเนื่องจากมันมีขนาดเล็กกว่า 16 คำสั่งจากนั้นจึงเป็นส่วนจริง) ส่วนประกอบนี้ได้รับการแนะนำโดยข้อผิดพลาดในการปัดเศษและความแม่นยำทั้งที่มีการคำนวณเองรวมถึงค่าที่เก็บไว้ของ pi เนื่องจากไม่มีเหตุผล (ดูลิงค์นี้สำหรับตัวอย่างอื่นที่เกี่ยวข้องกับจำนวนอตรรกยะ)

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


1
ฉันแค่ต้องการการยืนยันว่านี่เป็นพฤติกรรมทั่วไปของซอฟต์แวร์การวิเคราะห์เชิงตัวเลข
Siyuan Ren

@Karsus Ren ก็จริงพฤติกรรมของซอฟต์แวร์ประเภทนี้มีความแม่นยำสูงพอ ฉันรู้ว่าดูเหมือนว่าจะตอบโต้ได้ง่าย แต่ตัวเลขที่มีความแม่นยำต่ำจะไม่ส่งคืนความผิดปกติเหล่านี้บ่อยนัก ดูบทความนี้จาก Microsoftสำหรับรายละเอียดเพิ่มเติม แต่จำไว้ปัญหานี้เป็นการรวมกันของทั้งซอร์สโค้ดและสถาปัตยกรรมคอมไพเลอร์ / เป้าหมาย นอกจากนี้บทความ Wikipedia นี้มีข้อมูลพื้นฐานที่ดีเกี่ยวกับปัญหา
พัฒนา

1
ปัญหาพื้นฐานคือค่าคงที่ของอ็อกเทฟpiไม่ใช่ค่าคงที่ทางคณิตศาสตร์πแต่เป็นการประมาณจุดลอยตัวที่ใกล้เคียงกับมัน expฟังก์ชั่นเพิ่มข้อผิดพลาดเล็ก ๆ อีกครั้งเพื่อให้ได้ว่า ระบบที่ทำงานกับนิพจน์สัญลักษณ์สามารถคำนวณได้exp(i*pi)อย่างแม่นยำ ระดับแปดเสียงไม่ได้เป็นระบบดังกล่าว
Keith Thompson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.