Apakah ada perangkat lunak yang dapat membuat autogenerasi rutin floating point C yang akurat secara numerik dari formula simbolis?

25

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:

f (a, b, c) = \ frac {-b - \ sqrt {b ^ 2 - 4ac}} {2a}

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?

Daniel Trebbien
sumber
5
Masalah yang sulit secara umum.
dmckee
1
Jika masalahnya secara khusus tentang perhitungan root (atau faktorisasi) dari polinom, ada beberapa perpustakaan C (atau C ++) di luar sana.
moala
2
Anda mungkin ingin melihat serangkaian artikel Richard Harris yang luar biasa dalam jurnal ACCU Overload tentang The Floating Point Blues . Saya mengindeksnya di Programmer. X untuk orang-orang yang mungkin tertarik.
Mark Booth

Jawaban:

25

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 .)

Geoff Oxberry
sumber
4
"Sulit untuk menggantikan keahlian manusia dalam analisis numerik." - ini saja layak diberi +1.
JM
"Sulit" tidak sama dengan "tidak mungkin". Ada "teorema ketenagakerjaan penuh" untuk beberapa pekerjaan (misalnya penulis kompiler). Apakah ada satu untuk analis numerik?
Nama samaran
Iya nih. Teorema Padi .
Geoff Oxberry
14

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,gCcRsC

,

R(c,s)[fg]=[cs-s¯c][fg]=[r0]

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)

Jack Poulson
sumber
1
+1 Ini adalah contoh yang bagus, terima kasih. Saya kira jika solusi untuk real ada, maka mungkin disesuaikan dengan bilangan kompleks.
Daniel Trebbien
Saya mungkin harus menyebutkan bahwa kesulitan mendasar bukan pada kenyataan bahwa s bisa rumit, tetapi dalam menghindari overflow yang tidak perlu dan / atau underflow. Ini terkait dengan fungsi hypot: en.wikipedia.org/wiki/Hypot
Jack Poulson
11

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.

MRocklin
sumber
2
Sepakat; mungkin jawaban saya muncul sebagai terlalu pesimis, karena ada banyak solusi spesifik domain, tetapi masalah umum adalah ... sulit.
Jack Poulson
4

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 .

aterrel
sumber
1

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 .

mda
sumber