Diberikan fungsi nyata dari variabel nyata, apakah ada perangkat lunak yang tersedia yang dapat secara otomatis menghasilkan kode numerik-akurat untuk menghitung fungsi atas semua input pada mesin yang dilengkapi dengan aritmatika IEEE 754?
Misalnya, jika fungsi sebenarnya yang akan dievaluasi adalah:
Perangkat lunak akan mempertimbangkan pembatalan dahsyat dan mungkin pencarian tabel keluaran untuk set input tertentu untuk menghindari kerugian dalam akurasi komputasi.
Atau, apakah ada perangkat lunak yang dapat menghasilkan pencarian rutin berbasis tabel murni untuk menghitung fungsi yang diberikan ke akurasi tinggi?
software
floating-point
accuracy
Daniel Trebbien
sumber
sumber
Jawaban:
Solusi terbaik yang saya tahu adalah memprogram ekspresi simbolik dalam Mathematica , Maple , atau SymPy ; semua tautan langsung menuju dokumentasi pembuatan kode. Semua program di atas dapat menghasilkan kode dalam C atau Fortran.
Tak satu pun dari program di atas menyebutkan akurasi dalam aritmetika IEEE 754; secara umum, akan sulit untuk mengantisipasi semua sumber pembatalan bencana, seperti catatan @dmckee. Sulit untuk menggantikan keahlian manusia dalam analisis numerik.
Untuk memberikan contoh konkret, pertimbangkan untuk menghitung fungsi trigonometri hingga presisi tinggi untuk input sewenang-wenang dalam . Ada banyak strategi untuk melakukannya, beberapa bahkan tergantung pada perangkat keras, seperti yang terlihat dalam artikel Wikipedia Trigonometric Tables . Semua algoritma membutuhkan kecerdikan dan analisis numerik, bahkan algoritma yang tergantung pada tabel pencarian dan seri Taylor atau interpolasi (lihat artikel Wikipedia Dilema Meja-Pembuat ). Untuk lebih detail, lihat pertanyaan Stack Overflow terkait Bagaimana Fungsi Trigonometrik bekerja? .[ 0 , 2 π]
Perangkat lunak yang menghasilkan kode atau rutinitas untuk menghitung fungsi arbitrer hingga akurasi tinggi tidak hanya perlu mewaspadai kesalahan pembatalan, tetapi juga serangkaian aproksimasi (Taylor, Padé, Chebyshev, rasional, dll.) Untuk menghitung fungsi yang tidak didefinisikan dalam istilah sejumlah tambahan, pengurangan, perkalian, pembagian, dan pergeseran bit yang terbatas. (Lihat Teori Aproksimasi .)
sumber
Jika Anda ingin mengetahui seberapa jauh kami jauh dari paket perangkat lunak tersebut, silakan lihat catatan kerja LAPACK tahun 2001 tentang komputasi rotasi Givens secara andal dan efisien . Saya berharap sebagian besar non-spesialis (dan banyak spesialis!) Dalam analisis numerik terkejut melihat betapa banyak analisis yang digunakan untuk memecahkan masalah yang sangat sederhana:
Diberikan , temukan c ∈ R dan s ∈ C sedemikian rupaf, g∈ C c ∈ R s ∈ C
,
di mana adalah kesatuan. Menyeimbangkan keandalan dengan efisiensi komputasi bersama dengan masalah yang lebih halus seperti kontinuitas sangat tidak penting dan tidak mungkin terotomatisasi di masa mendatang.R ( c , s )
sumber
Pembuatan kode dan kompilasi ekspresi matematika menjadi lebih populer.
Sementara paket simbolik seperti SymPy, Mathematica, dan Maple dapat menyertakan pembuatan kode, saya tidak yakin bahwa ada di antara mereka yang berpikir keras tentang angka.
Ada beberapa proyek lain yang bisa dilihat yang tertarik dalam simbolik dan numerik.
Theano adalah proyek yang berfokus pada operasi array. Mereka mengidentifikasi dan mengganti beberapa operasi yang diketahui tidak terkondisi secara numerik. Saya tidak yakin bahwa ini termasuk kasus spesifik Anda, tetapi perlu dilihat.
Spiral mungkin juga menarik bagi Anda. Mereka juga mengkompilasi pohon sintaksis abstrak dan juga mencari masalah numerik. Mereka lebih peduli dengan operasi skalar (seperti contoh Anda). Namun mereka juga cukup khusus untuk domain tertentu.
Namun pertumbuhan di bidang ini menggembirakan. Orang bisa optimis bahwa pertanyaan Anda akan memiliki jawaban yang lebih baik dalam beberapa tahun.
sumber
Tidak secara umum, saya dapat dengan aman mengatakan implementor dari generator kode di SymPy bahkan tidak mencoba = P.
Paolo Bientinesi mengembangkan metode untuk menghasilkan bukti stabilitas algoritma aljabar linier, yang dihasilkan menggunakan notasi FLAME Robert van de Geijn.
Lihat makalah ini , atau versi catatan yang lebih panjang, yang berfungsi .
sumber
Sage memungkinkan Anda mengekspresikan rumus dalam Cython (varian python yang menghasilkan kode C); namun, untuk menjawab pertanyaan Anda yang lebih umum: tidak. Pertimbangkan Teorema Rice .
sumber