Mengapa ekspresi exp (i * pi) mengembalikan hasil yang salah dalam GNU Octave?


8

Saya mulai belajar GNU Octave hari ini, dan mencoba ungkapan pertama yang diberikan dalam manual

exp(i*pi)

Hasilnya adalah

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

Dan sepertinya Perpustakaan Ilmiah GNU memberikan hasil yang serupa juga.

Jadi apakah ini bug Octave, atau masalah umum dari perangkat lunak analisis numerik (perangkat lunak evaluasi simbolik pasti akan memberikan jawaban yang tepat)?


2
Tampaknya oktaf terutama dimaksudkan untuk analisis numerik. Mathematica pasti akan memberi Anda jawaban yang lebih baik ...: P hanya bercanda ... Coba cari solusi analisis simbolik GNU
gd1

@ Giacomo: Saya tahu itu. Saya hanya ingin tahu apakah semua perangkat lunak analitik numerik mengevaluasi ke nomor tersebut, atau hanya GNU Octave.
Siyuan Ren

@Karsus Ren ini sebenarnya bukan bug perangkat lunak, tetapi perangkat keras. Ini adalah batasan yang melekat dalam mencoba untuk mengevaluasi ekspresi dengan angka irasional pada perangkat keras dengan jumlah penyimpanan terbatas untuk satu nomor.
Terobosan

Jawaban:


8

Ini bukan bug dengan baik, tetapi karena cara komputer melakukan operasi floating point. Ada presisi terbatas yang dapat digunakan komputer mana pun, sehingga terkadang Anda akan melihat anomali seperti ini. Meskipun dimungkinkan untuk menulis perangkat lunak yang dapat menangani hal ini, akan membutuhkan lebih banyak waktu perhitungan dan secara drastis meningkatkan persyaratan memori.

Jika Anda melihatnya, e ^ (i * pi) mengembalikan -1 + 1.2x10 ^ -16i. Seperti yang Anda lihat, komponen imajiner sangat kecil (sebagian besar akan menganggapnya dapat diabaikan, karena 16 kali lipat lebih kecil dari bagian sebenarnya). Komponen ini diperkenalkan oleh kesalahan pembulatan dan ketepatan, baik dengan penghitungan itu sendiri, maupun nilai pi yang disimpan karena tidak rasional (lihat tautan ini untuk contoh lain yang berhubungan dengan bilangan irasional).

Jika kesalahan perhitungan ini tidak dapat diterima, Anda harus melihat ke dalam paket matematika yang melakukan analisis simbolik daripada numerik, atau yang menggunakan angka floating point presisi tinggi . Peringatan ini adalah bahwa mereka akan secara drastis meningkatkan kebutuhan memori Anda, dan analisis simbolis seringkali jauh lebih lambat. Juga, angka presisi yang lebih tinggi hanya akan mengecilkan besarnya kesalahan pembulatan / presisi, bukan menghilangkannya.


1
Saya hanya perlu konfirmasi bahwa ini adalah perilaku umum dari perangkat lunak analisis numerik.
Siyuan Ren

@Karsus Ren itu sebenarnya perilaku perangkat lunak semacam ini dengan presisi yang cukup tinggi . Saya tahu itu tampaknya kontra-intuitif, tetapi angka presisi yang lebih rendah tidak sering mengembalikan anomali ini. Lihat artikel ini dari Microsoft untuk detail lebih lanjut, tetapi ingat, masalah ini adalah kombinasi dari kedua kode sumber dan arsitektur kompiler / target. Juga, artikel Wikipedia ini memiliki beberapa informasi latar belakang yang bagus tentang masalahnya.
Terobosan

1
Masalah yang mendasarinya adalah bahwa konstanta oktaf pibukan konstanta matematika π, tetapi pendekatan floating-point dekat untuk itu. The expFungsi menambahkan kesalahan kecil lain untuk itu. Sistem yang bekerja dengan ekspresi simbolik dapat menghitung dengan exp(i*pi)tepat; Oktaf bukan sistem seperti itu.
Keith Thompson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.