Komputasi real: floating point vs TTE vs teori domain vs dll
19
Saat ini, perhitungan real dalam sebagian besar bahasa populer masih dilakukan melalui operasi floating point. Di sisi lain, teori-teori seperti tipe dua efektifitas (TTE) dan teori domain telah lama menjanjikan perhitungan real yang tepat. Jelas, masalah presisi floating point tidak berkurang dalam relevansi, jadi mengapa teori-teori ini tidak menjadi lebih utama dan mengapa tidak ada implementasi yang lebih mencolok dari mereka?
Misalnya, apakah ada domain aplikasi di mana kami tidak terlalu peduli dengan kesalahan floating point? Apakah ada masalah kompleksitas yang signifikan?
Saya bekerja dalam perhitungan bilangan real, dan saya berharap saya tahu jawaban yang sebenarnya. Tapi saya bisa berspekulasi. Ini masalah sosiologis, saya pikir.
Komunitas orang-orang yang bekerja pada aritmatika nyata yang tepat terdiri dari para ahli teori yang tidak terbiasa mengembangkan perangkat lunak. Jadi mereka biasanya menurunkan tugas implementasi kepada siswa (pengecualian yang menonjol adalah iRRAM Norbert Müller ), atau mereka memiliki implementasi mainan sendiri .
Orang-orang yang melakukan memiliki program yang diperlukan mojo tidak memiliki latar belakang teoritis yang diperlukan. Tanpa pijakan teoritis yang solid, sulit untuk merancang aritmatika nyata yang tepat dengan benar. Misalnya, adalah kesalahan untuk menambahkan banyak bilangan real dalam satu forlingkaran, karena Anda akan mendapatkan kinerja yang tidak dapat diterima karena kehilangan presisi. Jika Anda ingin menambahkan banyak dan banyak real, Anda harus melakukannya dengan struktur seperti pohon, dengan mempertimbangkan besarnya jumlah parsial. Hal lain yang sulit untuk diseberangkan adalah bahwa <dan =sebagai fungsi total boolean pada real tidak ada (Anda dapat memiliki =tetapi mengembalikan falseatau menyimpang, dan <menyimpang ketika diberi dua real yang sama).
Terakhir, tidak jelas sama sekali bahwa kita tahu bagaimana menerapkan perpustakaan untuk aritmatika nyata yang tepat. Itu bukan bagian biasa dari perpustakaan yang hanya mendefinisikan beberapa tipe data dan beberapa fungsi pada mereka. Seringkali aritmatika nyata yang tepat membutuhkan mode kontrol khusus. Sebagai contoh, iRRAM mengambil alih pelaksanaan utama program (benar-benar membajak main), serta input dan output standar, sehingga dapat menjalankan kembali program ketika kehilangan presisi terjadi. Perpustakaan saya untuk aritmatika nyata di Haskell terjadi di Stagedmonad (yang pada dasarnya adalah Readermonad). Kebanyakan orang mengharapkan angka sebenarnya menjadi "hanya tipe data", tetapi saya ragu tentang itu.
Saya hampir sepenuhnya ahli dalam aritmatika nyata, tetapi tidak bisakah seseorang menerapkan penjumlahan Kahan di dalamnya?
jjg
1
Hmm, kurasa tidak. Pikirkan aritmatika nyata yang tepat sebagai aritmatika interval yang mengatur sendiri presisi menengah untuk mencapai presisi keluaran yang diinginkan.
Andrej Bauer
3
Selain kurangnya pemahaman oleh pemrogram tentang fakta bahwa bilangan real adalah objek tanpa batas dan konsekuensinya untuk apa yang dapat dilakukan secara pemrograman, saya pikir kurangnya dukungan perangkat keras juga penting. Sulit meyakinkan orang untuk menggunakan sesuatu dengan waktu dan memori signifikan hanya untuk kebenaran.
Kaveh
1
Saya melihat bahwa ada beberapa kegiatan dalam mengimplementasikan komputasi nyata dengan tipe coinductive. Rasanya bagi saya bahwa tipe coinductive masih cukup sulit untuk dilakukan dengan benar (saya jelas bukan ahli di dalamnya), tetapi apakah Anda pikir ini menjanjikan untuk lebih banyak menggunakan komputasi nyata yang tepat?
SorcererofDM
3
Setiap implementasi yang menggunakan aliran digit, atau apa pun yang memiliki tingkat konvergensi tetap, sejak awal cacat karena konvergensi akan terlalu lambat. Selain itu, implementasi berbasis aliran cenderung memaksa Anda untuk menghitung semua perkiraan sebelumnya untuk mendapatkan yang berikutnya, yang juga merupakan kesalahan desain.
Andrej Bauer
10
Secara umum, orang selalu peduli tentang kesalahan floating point. Namun saya tidak setuju dengan Andrej, dan saya tidak berpikir bahwa pelampung lebih disukai daripada real presisi yang sewenang-wenang (sebagian besar) karena alasan sosiologis.
Saya percaya argumen utama terhadap perhitungan real real adalah salah satu kinerja . Jadi jawaban singkatnya adalah, setiap kali kinerja lebih penting daripada presisi, Anda akan ingin menggunakan angka floating point .
Aplikasi yang muncul dalam pikiran adalah penggunaan dinamika fluida komputasi untuk merancang aerodinamika mobil atau pesawat, di mana kesalahan kecil dalam perhitungan dengan mudah dibuat dengan keuntungan astronomi menggunakan unit floating point khusus yang ditemukan di banyak prosesor luas.
Secara khusus, masalah mewakili berbagai bilangan real menggunakan jumlah bit tetap tidak sepele seperti yang terlihat pada pandangan pertama. Dalam simulasi numerik, nilai dapat sangat bervariasi (misalnya ketika ada turbulensi), jadi perhitungan titik tetap tidak sesuai.
Bahkan ketika presisi tidak diperbaiki oleh perangkat keras, menggunakan angka presisi arbitrer dapat beberapa kali lipat lebih lambat daripada menggunakan angka floating point. Bahkan, bahkan dalam kasus bagus semua nomor tersebut rasional, operasi sederhana seperti pembalik matriks dapat mengakibatkan besar, sulit untuk mengontrol penyebut (lihat di sini untuk contoh). Banyak paket optimisasi linier besar menggunakan floating point dengan mode pembulatan yang sesuai untuk menemukan solusi perkiraan karena masalah ini (lihat misalnya, sebagian besar program ditemukan di sini ).
Adakah celah yang terbukti antara beberapa bentuk perhitungan real yang tepat dan perhitungan floating point?
SorcererofDM
1
Bukannya aku tahu, aku takut. Sean Gao memiliki beberapa hasil menarik pada kompleksitas prosedur keputusan perkiraan atas real (lihat abstrak tesisnya ) dan tentu saja penyebut dalam invers dari matriks tumbuh paling buruk seperti faktor penentu .
cody
-6
π
Maksud saya adalah bahwa jika Anda akan menghitung dengan tepat, Anda harus memiliki penampung untuk nama-nama khusus serta nama-nama yang akrab dengan naturals. Pada titik tertentu Anda akan ingin memperkirakan nilai yang tepat untuk menerapkannya pada sesuatu di dunia nyata. Ternyata, itu jauh lebih efisien untuk hanya menangani seluruh masalah sebagai perkiraan sejak awal, kecuali jika Anda memiliki kebutuhan yang sangat khusus.
Secara umum, orang selalu peduli tentang kesalahan floating point. Namun saya tidak setuju dengan Andrej, dan saya tidak berpikir bahwa pelampung lebih disukai daripada real presisi yang sewenang-wenang (sebagian besar) karena alasan sosiologis.
Saya percaya argumen utama terhadap perhitungan real real adalah salah satu kinerja . Jadi jawaban singkatnya adalah, setiap kali kinerja lebih penting daripada presisi, Anda akan ingin menggunakan angka floating point .
Aplikasi yang muncul dalam pikiran adalah penggunaan dinamika fluida komputasi untuk merancang aerodinamika mobil atau pesawat, di mana kesalahan kecil dalam perhitungan dengan mudah dibuat dengan keuntungan astronomi menggunakan unit floating point khusus yang ditemukan di banyak prosesor luas.
Secara khusus, masalah mewakili berbagai bilangan real menggunakan jumlah bit tetap tidak sepele seperti yang terlihat pada pandangan pertama. Dalam simulasi numerik, nilai dapat sangat bervariasi (misalnya ketika ada turbulensi), jadi perhitungan titik tetap tidak sesuai.
Bahkan ketika presisi tidak diperbaiki oleh perangkat keras, menggunakan angka presisi arbitrer dapat beberapa kali lipat lebih lambat daripada menggunakan angka floating point. Bahkan, bahkan dalam kasus bagus semua nomor tersebut rasional, operasi sederhana seperti pembalik matriks dapat mengakibatkan besar, sulit untuk mengontrol penyebut (lihat di sini untuk contoh). Banyak paket optimisasi linier besar menggunakan floating point dengan mode pembulatan yang sesuai untuk menemukan solusi perkiraan karena masalah ini (lihat misalnya, sebagian besar program ditemukan di sini ).
sumber
Maksud saya adalah bahwa jika Anda akan menghitung dengan tepat, Anda harus memiliki penampung untuk nama-nama khusus serta nama-nama yang akrab dengan naturals. Pada titik tertentu Anda akan ingin memperkirakan nilai yang tepat untuk menerapkannya pada sesuatu di dunia nyata. Ternyata, itu jauh lebih efisien untuk hanya menangani seluruh masalah sebagai perkiraan sejak awal, kecuali jika Anda memiliki kebutuhan yang sangat khusus.
sumber