Saat menyelidiki keakuratan angka floating point, saya pernah melihat di beberapa tempat pernyataan yang mirip
" float dan double adalah ( dirancang untuk / sering digunakan dalam ) perhitungan teknik dan ilmiah "
Dari pemahaman saya, kekuatan float dan double adalah jumlah memori yang mereka gunakan untuk presisi (baik, tetapi tidak sempurna) mereka.
Saya merasa hampir mendapatkan pemahaman dari jawaban ini
"angka floating point memungkinkan Anda memodelkan jumlah kontinu"
Saya masih tidak yakin saya mengerti. Teknik dan Sains keduanya terdengar seperti bidang di mana Anda ingin hasil yang tepat dari perhitungan Anda, yang, dari pemahaman saya, poin mengambang tidak memberikan. Saya juga tidak yakin mengikuti apa yang disebut "kuantitas terus menerus" itu.
Adakah yang bisa memperluas penjelasan ini dan mungkin memberi contoh?
sumber
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.
Baik dalam Sains dan Teknik, Anda hanya peduli pada ketepatan sampai titik tertentu. Menggunakan presisi tak terbatas untuk setiap perhitungan seringkali tidak perlu mahal. Yang membedakan floating point dari titik tetap adalah Anda tidak harus berkomitmen pada sejumlah tempat desimal - Anda dapat memiliki jumlah yang sangat kecil dengan banyak tempat desimal atau jumlah yang sangat besar dengan presisi terbatas.Jawaban:
Komputasi dalam sains dan teknik membutuhkan pengorbanan dalam presisi, jangkauan, dan kecepatan. Aritmatika titik tetap memberikan presisi, dan kecepatan yang layak, tetapi mengorbankan rentang. BigNum, pustaka presisi sewenang-wenang, menang dalam jangkauan dan presisi, tetapi kalah kecepatan.
Inti dari masalah ini adalah bahwa sebagian besar perhitungan ilmiah dan teknik membutuhkan kecepatan tinggi, dan jangkauan yang sangat besar, tetapi memiliki kebutuhan presisi yang relatif sederhana. Konstanta fisik yang paling baik ditentukan hanya diketahui sekitar 13 digit, dan banyak nilai diketahui dengan jauh lebih sedikit kepastian. Memiliki lebih dari 13 digit presisi di komputer tidak akan membantu itu. Lalat di salep adalah bahwa urutan operasi floating point secara bertahap dapat kehilangan presisi. Roti dan mentega dari analisis numerik mencari tahu masalah mana yang paling rentan terhadap hal ini, dan mencari tahu cara pintar menata ulang urutan operasi untuk mengurangi masalah.
Pengecualian untuk ini adalah teori bilangan dalam matematika yang perlu melakukan operasi aritmatika pada angka dengan jutaan digit tetapi dengan ketepatan absolut. Para ahli teori angka numerik sering menggunakan perpustakaan BigNum, dan mereka bertahan dengan perhitungan mereka yang memakan waktu lama.
sumber
a*b*c
hal-hal mudah, namun Anda perlu mengukur dimensi yang tidak dapat Anda lakukan dengan kepastian absolut, sehingga Anda tidak benar-benar membutuhkan ketepatan perhitungan yang tak terbatas, hanya cukup untuk diikat oleh kesalahan pengukuran.Apa alternatif yang Anda usulkan?
Kuantitas kontinu direpresentasikan menggunakan bilangan real dalam matematika. Tidak ada tipe data yang dapat menyandikan setiap bilangan real yang mungkin (karena real tidak terhitung), jadi itu artinya kita hanya dapat memilih subset dari bilangan real yang paling menarik bagi kita.
Anda dapat memilih semua real yang dapat dihitung, yang mirip dengan apa yang dilakukan sistem aljabar komputer (CAS). Masalahnya adalah bahwa itu menjadi tidak mungkin dengan cepat ketika pohon ekspresi Anda tumbuh semakin besar. Ini juga sangat lambat: cobalah memecahkan sistem persamaan diferensial besar dalam Mathematica secara simbolis dan bandingkan dengan beberapa implementasi berbasis floating-point lainnya dan Anda akan melihat perbedaan dramatis dalam kecepatan. Selain itu, seperti yang ditunjukkan Jörg W Mittag dan kasperd: Anda bahkan tidak memiliki operasi kesetaraan / perbandingan yang layak.
Anda dapat menggunakan angka rasional yang tepat, tetapi itu tidak benar-benar berfungsi untuk banyak aplikasi karena Anda perlu menghitung akar kuadrat atau cosinus atau logaritma dll. Selain itu, ada juga kecenderungan rasional menjadi semakin kompleks dan karenanya membutuhkan lebih banyak ruang untuk menyimpan dan waktu untuk memproses saat Anda melakukan lebih banyak perhitungan pada mereka.
Anda juga bisa menggunakan desimal presisi sewenang-wenang, tetapi bahkan sesuatu yang sesederhana pembagian tidak akan berhasil karena Anda mendapatkan digit berulang berulang. Anda juga dapat mengalami masalah meningkatnya kompleksitas saat Anda melakukan lebih mirip dengan bilangan rasional, meskipun pada tingkat yang lebih rendah.
Jadi, Anda akan dipaksa untuk menggunakan perkiraan di beberapa titik, dalam hal ini tepatnya di mana angka floating-point melakukan yang terbaik. Angka floating-point juga memiliki lebar tetap (tidak seperti ketiga tipe data lainnya yang disebutkan sebelumnya), yang mencegah peningkatan kompleksitas saat Anda melakukan lebih banyak dan lebih banyak perhitungan pada mereka.
sumber
Proposisi Anda tentang sains salah, Teknik dan Sains selain Matematika tidak bekerja dengan hasil yang tepat. Mereka bekerja dengan faktor presisi yang dibangun ke dalam berapa banyak angka yang Anda tunjukkan.
Istilah kunci yang perlu Anda pahami di sini adalah: angka signifikan . Angka-angka penting dari angka adalah angka-angka yang membawa makna berkontribusi pada ketepatannya.
Yang pada dasarnya berarti jika saya menyatakan bahwa ada sesuatu yang panjangnya 12 sentimeter, itu sebenarnya bisa berada di antara panjang 11,5 dan 12,5 sentimeter. Namun jika saya menyatakan bahwa sesuatu memiliki panjang 12,00 sentimeter, panjangnya bisa antara 11.995 dan 12.005 sentimeter.
Sama seperti ilustrasi, jika Anda mengambil pita pengukur dan mengukur ruang tamu Anda. Meskipun Anda mungkin menemukan bahwa itu 6 meter 25 sentimeter, Anda tahu bahwa pengukuran kaset Anda tidak cukup akurat untuk mengatakan apa pun tentang akurasi milimeter atau akurasi nano meter.
sumber
Perhatikan bahwa angka floating point pada dasarnya sama dengan notasi ilmiah dan teknik , cara standar bagi manusia untuk menulis angka dalam matematika dan sains. Dalam bidang-bidang ini, tidak ada kebutuhan besar untuk ketepatan yang ekstrem, tetapi sering kali ada kisaran yang sangat besar .
Untuk mengambil contoh acak dari pekerjaan rumah fisika saya, saya baru-baru ini harus bekerja dengan massa elektron, yang kira-kira 9,11 * 10 ^ -31 kg. Saya tidak terlalu peduli dengan presisi; bisa dengan mudah menjadi 9,12 untuk semua yang saya pedulikan. Tapi saya peduli dengan eksponen dan tidak mau harus menulis 0,0000 ... 911 kg, jadi saya menggunakan notasi ilmiah.
Alasan yang sama berlaku dalam komputasi ilmiah dan teknik: ada banyak sekali, tetapi kami tidak ingin harus menyimpan dan bekerja dengan jumlah yang sangat besar, jadi kami menyimpan nilai yang dinormalisasi dan eksponen, yang lebih kecil dan lebih cepat untuk bekerja dengannya.
sumber
Angka floating-point juga memiliki beberapa properti yang cocok untuk menghitung jenis hasil ilmiah tertentu. Paling khusus, presisi berbanding terbalik dengan besarnya, sama seperti dalam notasi ilmiah, sehingga Anda dapat mewakili baik perbedaan kecil mendekati nol dan perbedaan besar jauh lebih jauh.
Makalah Goldberg mungkin merupakan analisis yang paling terkenal tentang sifat-sifat angka floating-point (dan harus dibaca jika Anda peduli tentang hal semacam ini), tetapi makalah Kahan saya pikir melakukan pekerjaan yang lebih baik untuk menjelaskan alasan di balik banyak hal yang halus. masalah desain.
Secara khusus, kecaman Kahan tentang implementasi Java dari floating point , walaupun cukup menyakitkan, membuat beberapa poin bagus tentang mengapa semantik IEEE-754 berguna, dan Banyak Ado About Nothing's Sign Bit mengeksplorasi alasan untuk menandatangani nol secara mendalam.
sumber
real
jenis yang akan membawa tiga entri tumpukan untuk disimpan, dan akan mewakili presisi komputasi alami mesin; nilai dapat disimpan sebagai pelampung 80-bit + 16 bit yang melapisi pelampung 64-bit + 32 bit, atau mantissa 64 bit, eksponen 16 bit, dan 16 bit untuk tanda dan bendera [untuk implementasi non-FPU].float
dandouble
merupakan format penyimpanan, danreal
merupakan format komputasi. Dalam banyak sistem tanpa FPU, bekerja dengan mantra, eksponen, dan bendera yang berada di batas kata dan setengah kata akan lebih cepat daripada harus membongkar dan mengemas ganda dengan setiap operasi.TL; DR Kami tidak tahu cara menghitung sebagian besar fungsi dengan presisi sempurna, oleh karena itu tidak ada titik yang mewakili angka dengan presisi sempurna.
Semua jawaban sejauh ini kehilangan poin terpenting: kita tidak dapat menghitung nilai pasti dari sebagian besar angka. Sebagai kasus khusus yang penting, kami tidak dapat menghitung nilai pasti dari fungsi eksponensial - untuk hanya mengutip fungsi irasional yang paling penting.
Jawaban naif untuk pertanyaan naif
Tampaknya pertanyaan Anda agak "ada perpustakaan aritmatika yang tepat, mengapa kita tidak menggunakannya di tempat aritmatika floating point?" Jawabannya adalah bahwa aritmatika yang tepat bekerja pada bilangan rasional dan bahwa:
Angka rasionalnya adalah kecelakaan yang beruntung. Sebagian besar angka tidak rasional (lihat teorema Baire) sehingga menghitung angka akan selalu membawa kita keluar dari dunia rasional.
Apa itu komputasi dan mewakili angka?
Kita dapat bereaksi dengan mengatakan, “Baiklah, masalahnya adalah bilangan rasional bukanlah pilihan yang tepat untuk mewakili bilangan real.” Kemudian kami menggulung garpu sleave kami, Debian, dan menyusun sistem representasi baru untuk bilangan real.
Jika kita ingin menghitung angka, kita harus memilih sistem representasi untuk bilangan real dan menggambarkan operasi penting pada mereka - yaitu mendefinisikan apa arti komputasi . Karena kami tertarik pada komputasi ilmiah, kami ingin merepresentasikan secara akurat semua angka desimal (ukuran kami), kueriennya (angka rasional), nilai fungsi eksponensial, dan beberapa konstanta lucu, seperti angka Archimede.
Masalahnya adalah bahwa satu-satunya cara untuk secara sempurna mewakili angka dalam sistem semacam itu adalah dengan menggunakan bentuk simbolis, yaitu, tidak menghitung apa pun dan bekerja dengan ekspresi aljabar. Ini adalah representasi bilangan real yang agak lumpuh, karena kita tidak dapat secara andal membandingkan dua angka (mana yang lebih besar)? Kita bahkan tidak bisa dengan mudah menjawab pertanyaan "Apakah angka yang diberikan sama dengan 0?".
Jika Anda mencari definisi dan masalah matematika yang lebih tepat, cari bilangan rasional, bilangan transendental, perkiraan terbaik, dan teorema Baire, misalnya.
sumber
Karena
1) Para penulis membuat asumsi bahwa "perhitungan rekayasa dan ilmiah" mengukur kuantitas fisik dunia nyata
2) Jumlah fisik kontinu, dan persis seperti yang Anda sebutkan "angka floating point memungkinkan Anda memodelkan jumlah kontinu"
.. dan sisa jawaban saya disimpulkan dengan baik oleh Rufflewind , jadi saya tidak akan mengulanginya di sini.
sumber
Angka floating point memberikan akurasi relatif: mereka dapat mewakili angka yang paling banyak persentase kecil (jika Anda ingin memanggil sesuatu seperti 0,0000000000001% persentase) jauh dari angka akurat melalui berbagai angka. Mereka berbagi sifat ini dengan aturan slide, meskipun yang terakhir tidak mendapatkan yang lebih baik daripada sekitar 3 digit akurasi. Namun, itu cukup memadai untuk mengetahui kekuatan statis dan dinamis dari struktur besar sebelum komputer digital menjadi hal biasa untuk itu, dan itu karena konstanta material juga menunjukkan beberapa variasi, dan memilih konstruksi yang cukup jinak terhadap material dan perbedaan konstruksi akan cenderung untuk membuat muatan maksimum dan titik lemah dapat diidentifikasi secara wajar.
Sekarang "akurasi" adalah fitur yang berguna untuk banyak angka yang mewakili pengukuran dan / atau besaran sifat fisik.
Tidak semua dalam sains / teknik termasuk dalam kategori itu. Misalnya, jika Anda menggunakan transformasi teoretik bilangan untuk mengalikan bilangan besar atau bidang Galois untuk memanipulasi polinomial koreksi kesalahan, tidak ada yang namanya kesalahan kecil: kesalahan bit apa pun selama pemrosesan akan menghasilkan hasil yang sangat sulit dibedakan dari acak sepenuhnya. kebisingan.
Bahkan di daerah-daerah tersebut seseorang dapat bekerja dengan angka floating point (seperti menggunakan FFT kompleks untuk melakukan konvolusi) jika seseorang melacak akumulasi kesalahan dan memastikan bahwa kesalahan floating point tidak mengakumulasi besaran yang cukup untuk bahkan mungkin membalik sedikit pun dalam entitas aktual yang merupakan perkiraan. Untuk perkiraan seperti itu, pemrosesan titik tetap kemungkinan akan lebih tepat tetapi unit floating point di lapangan cenderung memberikan operasi yang lebih cepat dan sejumlah besar bit yang dapat digunakan.
Juga bahasa pemrograman seperti C atau Fortran membuatnya sangat sulit untuk mengakses operasi dasar seperti multiplikasi dan pembagian presisi campuran atau carry bit untuk penambahan / pengurangan, dan itu adalah blok bangunan dasar untuk melampaui bilangan bulat presisi terbatas.
Jadi, jika Anda dapat memetakan operasi ke angka floating point, Anda cenderung memiliki perangkat keras yang cukup kuat saat ini dan Anda dapat menentukan algoritma Anda dengan baik di salah satu bahasa pemrograman tujuan umum saat ini.
sumber
Saya pikir ini bisa dijawab dengan membahas jenis aplikasi
float
/double
data apa yang tidak cocok.Ketika Anda perlu memastikan bahwa Anda dapat mewakili angka secara akurat dengan jumlah digit tertentu, maka angka floating point tidak tepat, karena angka tersebut mewakili angka sebagai kekuatan 2, bukan kekuatan 10, seperti cara kami mewakili angka dalam dunia nyata.
Jadi satu domain di mana tipe data floating point tidak boleh digunakan adalah keuangan *. Untuk sistem inti misalnya bank, akan sama sekali tidak dapat diterima jika jumlah yang seharusnya $ 100000,01 tiba-tiba menjadi $ 100000,00 atau $ 100000,02.
Masalah seperti itu dapat dengan mudah terjadi ketika menggunakan pelampung, terutama jika jumlahnya adalah hasil dari satu atau lebih perhitungan, misalnya menghitung jumlah semua transaksi dalam suatu akun.
Teknik dan perhitungan ilmiah adalah domain tempat kesalahan pembulatan yang relatif kecil ini dapat diterima. Pengguna biasanya menyadari bahwa semua angka memiliki presisi terbatas, dan mereka sering bekerja dengan sejumlah digit signifikan . Tetapi yang paling penting mereka memiliki presisi relatif yang terdefinisi dengan baik, yaitu mereka telah memberikan jumlah digit signifikan yang sama, baik untuk jumlah yang sangat besar, dan untuk jumlah yang sangat kecil.
* Saya pernah bekerja pada aplikasi keuangan
float
di mana s telah digunakan untuk mewakili nilai, dan sebagai akibatnya, kesalahan pembulatan diperkenalkan. Untungnya, bug khusus ini sama sekali tidak kritis, pengguna mengeluhkan kesalahan perhitungan dalam program. Dan ini menyebabkan efek yang berbeda, jauh lebih buruk: pengguna mulai kehilangan kepercayaan pada sistem.sumber