Saya melihat sangat sedikit perpustakaan / paket komputasi non-floating point. Mengingat berbagai ketidakakuratan representasi floating point, muncul pertanyaan mengapa tidak ada beberapa bidang di mana akurasi yang meningkat ini sebanding dengan seluk-beluk bekerja dengan fixed-point.
Apakah ada kesulitan besar dalam menggunakan, katakanlah, pemecah nilai eigen titik tetap? Seberapa lambat / cepat, tidak akurat / akuratnya mereka?
floating-point
numerics
Milind R
sumber
sumber
Jawaban:
Penggunaan aritmatika titik tetap dapat sesuai dalam kondisi tertentu. Umumnya untuk komputasi ilmiah (setidaknya dalam arti bahwa kebanyakan orang memikirkannya) itu tidak tepat karena kebutuhan untuk mengekspresikan rentang dinamis besar yang dihadapi. Anda menyebutkan masalah nilai eigen sebagai contoh, tetapi sangat sering dalam sains, orang tertarik pada nilai eigen terkecil dari sebuah matriks (katakanlah, dalam menghitung keadaan dasar sistem kuantum). Keakuratan nilai eigen kecil umumnya akan cukup memburuk relatif terhadap nilai eigen besar jika Anda menggunakan titik tetap. Jika matriks Anda berisi entri yang bervariasi berdasarkan rasio besar, nilai eigen kecil mungkin sama sekali tidak dapat diekspresikan dalam presisi kerja. Ini adalah masalah dengan representasi angka; argumen ini berlaku terlepas dari bagaimana Anda melakukan perhitungan perantara. Anda mungkin dapat menentukan skala untuk menerapkan hasil yang dihitung, tetapi sekarang Anda baru saja menemukan titik mengambang. Mudah untuk membuat matriks yang elemen-elemennya berperilaku baik, tetapi nilai eigennya berperilaku sangat buruk (sepertiMatriks Wilkinson , atau bahkan matriks dengan entri yang sepenuhnya bilangan bulat ). Contoh-contoh ini tidak se-patologis kelihatannya, dan banyak masalah di ujung tombak sains melibatkan matriks yang berperilaku sangat buruk, jadi menggunakan titik tetap dalam konteks ini adalah Ide Buruk (TM).
Anda mungkin berpendapat bahwa Anda mengetahui besarnya hasil dan Anda ingin tidak membuang bit pada eksponen, jadi mari kita bicara tentang perantara. Menggunakan titik tetap umumnya akan memperburuk efek pembatalan dan pembulatan katastropik kecuali Anda benar-benar berusaha keras untuk bekerja dalam presisi yang lebih tinggi. Penalti kinerja akan sangat besar, dan saya akan menduga bahwa menggunakan representasi floating point dengan lebar bit mantissa yang sama akan lebih cepat dan lebih akurat.
Satu area di mana titik tetap dapat bersinar adalah di area tertentu dari komputasi geometris. Terutama jika Anda membutuhkan aritmatika yang tepat atau mengetahui rentang dinamis semua angka sebelumnya, titik tetap memungkinkan Anda memanfaatkan semua bit dalam representasi Anda. Sebagai contoh, misalkan Anda ingin menghitung persimpangan dua garis, dan entah bagaimana titik akhir dari dua garis tersebut dinormalisasi untuk duduk di unit square. Dalam hal ini, titik persimpangan dapat direpresentasikan dengan lebih banyak bit presisi daripada menggunakan angka floating point yang setara (yang akan membuang bit pada eksponen). Sekarang, hampir dapat dipastikan bahwa bilangan antara yang diperlukan dalam perhitungan ini perlu dihitung dengan presisi yang lebih tinggi, atau setidaknya dilakukan dengan sangat hati-hati (seperti ketika membagi produk dari dua angka dengan angka lain, Anda harus sangat berhati-hati tentang hal itu ). Dalam hal ini, titik tetap lebih menguntungkan dari sudut pandang representasi daripada dari sudut pandang komputasi, dan saya akan melangkah lebih jauh dengan mengatakan ini secara umum benar ketika Anda dapat menetapkan batas atas dan bawah yang pasti pada rentang dinamis dari output algoritma Anda. . Ini jarang terjadi.
Dulu saya berpikir bahwa representasi floating point kasar atau tidak akurat (mengapa membuang bit pada eksponen ?!). Tetapi seiring berjalannya waktu saya menyadari bahwa ini adalah salah satu representasi terbaik untuk bilangan real. Hal-hal di alam muncul pada skala log, sehingga data nyata akhirnya mencakup sejumlah besar eksponen. Juga untuk mencapai akurasi relatif setinggi mungkin, diperlukan pengerjaan skala log, membuat pelacakan eksponen lebih alami. Satu-satunya pesaing lain untuk representasi "alami" adalah indeks tingkat simetris . Namun, penambahan dan pengurangan jauh lebih lambat dalam representasi itu, dan tidak memiliki dukungan perangkat keras dari IEEE 754. Sejumlah besar pemikiran dimasukkan ke dalam standar floating point., dengan pilar aljabar linear numerik. Saya pikir dia tahu apa representasi angka yang "benar".
sumber
Sebagai contoh mengapa aritmatika / aritmatika titik pasti sangat jarang digunakan, pertimbangkan ini:
Dalam metode elemen hingga, seperti pada hampir setiap metode lain yang digunakan dalam komputasi ilmiah, kita sampai pada sistem linier atau nonlinier yang hanya merupakan perkiraan terhadap dunia nyata. Misalnya, dalam FEM, sistem linier untuk menyelesaikan hanya merupakan perkiraan terhadap persamaan diferensial parsial asli (yang mungkin, itu sendiri, hanya merupakan perkiraan dari dunia nyata). Jadi mengapa berusaha keras untuk menyelesaikan sesuatu yang hanya merupakan perkiraan?
Sebagian besar algoritma yang kami gunakan saat ini bersifat iteratif: metode Newton, Conjugate Gradients, dll. Kami mengakhiri iterasi ini setiap kali kami puas bahwa keakuratan iteratif yang mendekati solusi masalah sudah cukup. Dengan kata lain, kami mengakhiri sebelum kami memiliki solusi yang tepat. Seperti sebelumnya, mengapa menggunakan aritmatika yang tepat untuk skema iteratif ketika kita tahu bahwa kita hanya menghitung perkiraan?
sumber
float
dalam waktu dekat.Jika Anda melihat perpustakaan ini untuk pembulatan yang benar: CRlibm , Anda akan melihat dalam dokumentasi bahwa secara umum, algoritma harus terbukti akurat (dengan bukti beralasan). Mengapa? Stabilitas dan kecepatan konvergensi hasil suatu fungsi tidak memiliki jawaban "satu ukuran untuk semua". Singkatnya, ada "tidak ada makan siang gratis" - Anda harus bekerja untuk membuktikan bahwa alasan Anda benar. Ini disebabkan oleh perilaku fungsi yang dimodelkan, bukan perangkat keras yang mendasari (apakah Anda menggunakan unit integer atau floating point, meskipun ya, keduanya memiliki "gotcha", seperti overflow / underflow, angka denormal, dll.) Bahkan jika hasilnya Anda mencari konvergen ke integer, algoritma yang digunakan untuk menemukan hasilnya belum tentu sangat stabil.
Eigen adalah pustaka C ++ yang memiliki berbagai algoritma untuk menyelesaikan matriks, masing-masing dengan sifat yang berbeda. Halaman ini berisi tabel yang membahas trade-offs kecepatan vs akurasi untuk berbagai algoritma yang digunakan untuk memecahkan matriks. Saya menduga perpustakaan Eigen dapat melakukan apa yang Anda inginkan. :-)
sumber
Untuk beberapa contoh bagus di mana aritmatika presisi tinggi berguna dalam matematika, lihat buku Mathematics by Experiment oleh Jonathan Borwein dan David Bailey. Ada juga sekuel ini , yang belum saya baca.
sumber