Mengapa ketelitian modulus floating point penting?

9

Kebanyakan dialek Smalltalk saat ini menerapkan modulus apung yang tidak eksak (fmod / sisanya).
Saya baru saja mengubah ini untuk meningkatkan Squeak / Pharo dan akhirnya kepatuhan Smalltalk lainnya terhadap standar (IEEE 754, ISO / IEC 10967), seperti yang telah saya lakukan untuk operasi floating point canggih lainnya.

Namun untuk penerapan perubahan-perubahan itu, saya mengantisipasi bahwa mematuhi standar tidak akan cukup untuk meyakinkan rekan-rekan saya, jadi menjelaskan dalam keadaan mana ketepatan ini akan sangat berarti akan banyak membantu saya. Sejauh ini saya tidak dapat menemukan contoh yang baik.

Apakah ada orang di sini yang tahu mengapa / kapan / di mana (IOW dalam algoritma mana) ketepatan modulus seperti itu penting?

alias bagus
sumber
Saya pikir Anda mungkin mendapatkan jawaban yang lebih baik tentang Ilmu Komputasi karena masalah seperti itu lebih penting dalam domain (sub-) mereka. Bagaimanapun, pertanyaannya adalah ontopic di sini dan Anda harus memberikan penjawab kami beberapa hari sebelum pemasangan ulang.
Raphael
1
Saya telah melihat kode bergantung pada ketepatan fmod / modf yang membuat saya bergidik, tetapi kemungkinan bahwa suatu bahasa mungkin berani menerapkan modulus floating point yang tidak eksak yang naif tampaknya bahkan lebih menakutkan. Kode contoh: (1) Ambil sisanya. (2) Hentikan jika nol. (3) Lipat gandakan dengan 2 dan lanjutkan ke (1). Seseorang dapat melakukan pekerjaan yang bermanfaat selama proses ini, tetapi poin penting adalah bahwa penghentian proses ini bergantung pada ketepatan sisa dan ketepatan penggandaan oleh 2. Tidak yakin apakah saya harus memberikan jawaban yang lebih lengkap di sini, karena Ilmu Komputer tampaknya lebih tepat untuk pertanyaan ini.
Thomas Klimpel
Satu tebakan: menormalkan input fungsi trigonometri.
Paul A. Clayton
@ThomasKlimpel Saya tertarik jika Anda menemukan referensi. Perhatikan bahwa sisa naif didefinisikan sebagai (x - ((y / x) terpotong * x)) dengan putaran IEEE ke operasi genap terdekat, kita dapat membuktikan bahwa exactRem (x, y) == 0 => naiveRem (x, y) == 0. Masalahnya adalah sebaliknya - salah pembagian pasti positif - seperti naiveRem (4.0.0.1) == 0,0 yang sayangnya sesuai dengan harapan naif dalam banyak kasus!
aka.nice
@ PaulA.Clayton ya, untuk sinus dalam derajat mungkin ... Meskipun, tebakan saya adalah bahwa rem naif bekerja sama baiknya dengan rem yang tepat hingga kira-kira. 1e16 derajat karena 360 hanya memiliki kisaran 6 bit yang ditetapkan, dan karena pembagian oleh 360 tampaknya tidak pernah cocok untuk pendahulunya dari banyak 360 ... Untuk radian perpustakaan yang layak memerlukan presisi ganda, lakukan rem yang tepat terbatas pada presisi ganda benar-benar membantu dalam kasus seperti itu?
aka.nice

Jawaban:

1

Perhatikan bahwa implementasi floating point yang tidak tepat mempengaruhi cuaca.

Ada beberapa tes yang menjalankan prediksi cuaca dengan input yang sama pada perangkat keras yang berbeda dan prediksi tersebut berbeda. Jika Anda menjalankan algoritma iteratif maka perbedaan pembulatan kecil di sini atau di sana dapat menghasilkan efek kupu-kupu mengubah sinar matahari menjadi hujan.

Aturan pembulatan dalam standar (IEEE 754, ISO / IEC 10967) telah dipikirkan dengan cermat sehingga algoritma numerik berperilaku dapat diprediksi dengan paling akurat dan mereproduksi hasil yang sama setiap saat. Dengan tidak mengikuti algoritma numerik standar yang dirancang untuk aturan pembulatan itu akan rusak dan algoritma iteratif seperti prediksi cuaca bahkan dapat memberikan hasil acak.

(dan bukankah itu mengatakan sesuatu tentang prediksi cuaca? :)

Goswin von Brederlow
sumber
1
Di sisi lain, jika efek kupu-kupu mengubah sinar matahari menjadi hujan, maka hasilnya Anda tidak berguna.
gnasher729
Sekali waktu, saya menyimpan data float di ASCII dengan angka yang tidak cukup. Satu klien ingin menunjukkan kepada saya masalah, tetapi setelah mengembalikan data dari file ASCII, masalah menghilang. Saya mengatakan bahwa beberapa ulp off seharusnya tidak masalah, jika masalahnya buruk, tidak ada yang bisa saya lakukan. Dia mengatakan bahwa itu adalah bisnisnya, milikku adalah untuk menyediakan perangkat lunak yang memungkinkan reproduksi masalah-masalahnya sendiri. Dia benar.
aka.nice
Itu sebabnya Anda harus menampilkan angka floating point untuk disimpan sebagai hexadecimal menggunakan% a.
Goswin von Brederlow