Menjelaskan presisi floating point kepada pelanggan [ditutup]

23

Apa cara terbaik untuk menjelaskan masalah pembulatan titik mengambang kepada pelanggan ?

aku tahu

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

serta entri dalam C ++ FAQ dan berbagai halaman lain yang ditujukan untuk pengembang dan ilmuwan, tetapi apakah ada halaman web, artikel atau penjelasan, yang ditujukan untuk pelanggan "biasa" dengan latar belakang matematika atau ilmiah terbatas? (yang referensi di atas jatuh datar).

Jika itu dipertahankan atau berasal dari lembaga atau korporasi yang terkenal dan terkenal, semuanya lebih baik, mengingat, seperti yang mungkin dialami beberapa dari Anda, mungkin akan sedikit rumit untuk menjelaskannya sendiri.

Eric Grange
sumber
1
Saya tidak akan repot-repot ...
John Shaft
1
Ini pertanyaan yang sangat fantastis, +10 kalau bisa. Masalah yang sering terjadi pada pengembang.
Cody Gray
2
Ini bukan masalah detail, itu menjawab mengapa mengapa menambahkan apa yang terlihat pada angka presisi 2 digit desimal, Anda berakhir dengan 5,9999999 dan bukan 6, dan mengapa Anda harus menentukan presisi pembulatan ketika "jelas" hasilnya tidak boleh t memiliki lebih dari dua digit desimal. Atau mengapa terkadang 2 minus 2 tidak selalu nol, dan tidak terlihat seperti orang bodoh yang melakukan hal itu.
Eric Grange
9
@Eric Grange: jika pelanggan Anda menganggap masalah presisi itu sebagai bug, maka itu adalah bug dan Anda harus menemukan cara untuk memperbaikinya (mungkin dengan tidak menggunakan float). Mereka tidak peduli dari mana masalah presisi ini berasal. Mereka tidak peduli tentang cara kerja perangkat lunak Anda. Mereka hanya ingin itu berhasil.
David
3
@ Eric: Penggunaan floating-point adalah detail implementasi. Saya ulangi pertanyaan saya, yang meminta bukan sesuatu yang dijelaskan dalam pertanyaan, dan yang saya jelaskan tidak jelas (permintaan maaf): apa konteksnya, dan mengapa Anda mendiskusikan penggunaan floating point dengan pelanggan?
Tom Anderson

Jawaban:

8

Saya menemukan cara sederhana untuk menjelaskan ini dengan menunjukkannya . Diskusikan bagaimana membaginya xdengan angka, kemudian mengalikannya dengan angka yang sama akan mengembalikan Anda xlagi - membuat pelanggan setuju bahwa ini harus selalu menjadi masalah. Kemudian lakukan yang lama (100 / 3) * 3dengan kalkulator; menunjukkan bahwa nilainya tidak, seperti yang Anda harapkan, kembali ke 100. Ketika kebanyakan orang melihat matematika sederhana "mogok", maka cenderung 'mendapatkan' bahaya angka floating point di mana akurasi penting (meskipun secara intuitif cara, daripada ke tingkat rendah artikel yang Anda tuju).

Sayangnya sebagian besar kalkulator yang setengah layak (tentu saja semua yang ilmiah yang pernah saya lihat, dan lebih dari beberapa yang dasar) saat ini mampu menangani ini - saya kira mereka menyimpan digit tambahan di luar apa yang dapat ditampilkan dan dibulatkan - begitu juga periksa seberapa pintar kalkulator Anda sebelum Anda melakukannya di depan pelanggan Anda.

Scott
sumber
1
Ya, hampir semua kalkulator menyimpan setidaknya 2 digit tambahan, jadi Anda harus menambahkan beberapa kali dalam campuran, yang membingungkan penjelasan, dan IME membuat mereka berpikir Anda mencoba menipu mereka. Root kuadrat membutuhkan lebih sedikit operasi, tetapi root kuadrat sudah di luar ranah sehari-hari pelanggan reguler.
Eric Grange
2
@Scott Saya mencoba beberapa kalkulator di sini, tidak ada masalah dengan (100/3) * 3, bahkan (100/3) * 3-100 tidak menunjukkan masalah .... Excel juga benar.
Eric Grange
9
Ambil uang sebagai contoh, yang memiliki presisi terbatas yang sempurna. Jelaskan Anda membagi satu dolar, maka setiap orang mendapat 33 sen dan satu sen hilang dalam pembulatan. Siapa pun dapat mengaitkannya dengan itu.
Inca
4
Jangan repot-repot dengan kalkulator. Bagilah 1 dengan 3 di atas kertas, pertahankan tiga angka signifikan.
David Thornley
5
@omegacentauri jika Anda berpikir penjelasan itu membantu, saya kira Anda tidak sering berbicara dengan pelanggan.
jhocking
5

Saya tidak berpikir ada jalan pintas. Anda harus:

  • Pahami apa itu floating point dan bagaimana kelakuannya.

Atau, jika itu terlalu banyak dibutuhkan, Anda harus:

  • Terima bahwa komputer tidak akan memberi Anda hasil numerik yang tepat.

Mungkin contoh dengan angka irasional membantu (meskipun floating masalah titik berlaku untuk bilangan rasional juga): sqrt(2) ~ 1.414. Lalu 1.414^2 = 1.999396. Tidak peduli berapa banyak digit yang Anda ambil, Anda tidak akan pernah kembali ke aslinya 2. Ok, 4 digit signifikan yang benar mungkin dapat diterima, tetapi kemudian pertimbangkan apa yang terjadi ketika "kesalahan pembulatan" ini menumpuk. Di situlah bahaya sesungguhnya.

Joonas Pulakka
sumber
2
Saya pribadi tahu dan mengerti, tetapi bagi sebagian orang "floating point" sudah merupakan istilah asing, jadi Anda perlu lebih dari sekadar penjelasan matematis atau ilmiah untuk menjelaskan bahwa apa yang dapat mereka hitung tepat di kepala mereka, komputer dan perangkat lunak mereka yang mahal mengalami kesulitan dalam memperbaiki ;) Juga akar kuadrat berada di luar bidang pelanggan reguler sehari-hari.
Eric Grange
5

Pertama, tentukan apa yang mereka keluhkan. Transaksi keuangan harus dilakukan dengan tepat, dengan jumlah desimal yang tepat dan aturan pembulatan yang tepat. Ini biasanya berarti mempertahankan angka integral dari unit mata uang dan memastikan aritmatika dilakukan dengan benar.

Atau, mereka mungkin mengeluh tentang tampilan berlebih, dan mengurangi jumlah output digit signifikan mungkin semua yang diperlukan.

Untuk angka pada umumnya, Anda selalu dapat mencoba untuk membuat desimal tiga digit x sehingga x * 3 adalah 10. Itu menunjukkan prinsip-prinsip dasar.

Ada dua masalah yang tersisa. Salah satunya adalah bahwa angka-angka tertentu dapat dinyatakan tepat dalam desimal tetapi bukan biner (3,15, katakanlah). Itu akan sulit untuk dijelaskan kepada orang-orang non-teknis, dan taruhan terbaik Anda adalah mencoba menghindarinya dengan tidak memberikan angka yang cukup signifikan untuk ditampilkan. Yang lain adalah pelanggan yang tahu sedikit, cukup untuk mengetahui bahwa aritmatika komputer tidak selalu tepat dan tidak cukup untuk menyadari bahwa aritmatika desimal tidak selalu tepat. Saya telah berdebat dengan beberapa dari mereka, dan tidak ada yang berguna untuk dilaporkan.

David Thornley
sumber
3

Angka floating point di komputer menggunakan biner, jadi sama seperti kita memiliki sistem angka dengan satu, puluhan, ratusan, dan persepuluh, ratusan kolom, angka floating point di komputer benar-benar memiliki satu, dua, empat, dan setengah, empat perempat, dan kolom kedelapan. Jika pelanggan terbiasa dengan kaki / inci, maka ingatkan mereka tentang bagaimana Anda biasanya menggunakan fraksi dasar-2 inci untuk pengukuran.

Sekarang cobalah untuk menyimpan 10 sen sebagai kombinasi bagian, perempat, per delapan dolar. Itu tidak bekerja:

.00011001100110011. . . ( mengulangi tanpa batas )

Itu sama dengan mengambil pita pengukur kekaisaran standar dan mencoba mengukur sepersepuluh inci. Anda tidak dapat melakukannya dengan akurat. Tidak ada representasi 1/10 sebagai X / Y di mana X dan Y adalah bilangan bulat dan Y adalah kekuatan 2.

Itu sebabnya kami memiliki tipe data desimal yang menggunakan 4 bit untuk menyimpan setiap digit desimal , jadi kami kembali ke representasi basis 10. Imbalannya adalah dalam ruang dan kinerja (sekitar hit kinerja 100%, dari apa yang saya baca).

Scott Whitlock
sumber
1

Katakan kepada mereka bahwa sama seperti rekening bank mereka tidak dapat menampung 4,4423425908459032890413 ... dolar (itu adalah $ 4,44 atau $ 4,45, tidak ada di antaranya), komputer tidak dapat dengan mudah menyimpan nomor dengan presisi sewenang-wenang. Ketidaksempurnaan penyimpanan menyebabkan ketidaksempurnaan perhitungan.

(Ini sedikit curang, tetapi harus memberi mereka gambaran tentang apa masalahnya.)

quant_dev
sumber
2
Sayangnya, penjelasan itu tidak berhasil, karena masalah presisi dapat terjadi ketika menyimpulkan angka-angka yang semuanya hanya memiliki dua digit presisi untuk memulai.
Eric Grange
1
Dua digit desimal . Ya, saya setuju, pelanggan yang ingin tahu akan menemukan lubang di dalamnya. Tetapi kemudian Anda dapat mengenai mereka dengan diskusi tentang representasi biner - mereka memintanya ;-)
quant_dev
Nah, sudah mencoba menjelaskan titik apung mereka IME segera mulai berpikir Anda mencoba memperdaya mereka, yang merupakan sesuatu yang bisa diringankan jika itu datang dalam istilah yang sederhana, dapat dimengerti, atau dari lembaga atau perusahaan yang tahu. :)
Eric Grange
1
@Eric Math susah, ayo main baseball: P
quant_dev
1
Tanyakan apakah lebih tepat untuk mengukur sesuatu ke 1/10 "terdekat, atau milimeter terdekat. Yang terakhir lebih tepat, tetapi objek yang merupakan kelipatan tepat 0,1" tidak akan menjadi kelipatan tepat 1mm kecuali mereka juga merupakan kelipatan tepat 5 "(tepat 127mm). Menambahkan ukuran dua benda 2,54mm yang diukur ke 0,1" terdekat akan menghasilkan ukuran gabungan 0,2 "; menambahkan bersama ukuran yang dibulatkan ke milimeter terdekat akan menghasilkan 6mm meskipun ukuran sebenarnya harus 5.08mm
supercat
1

2/3

Mintalah mereka untuk menuliskan jawaban yang tepat untuk dua dibagi dengan 3.
Karena jawaban 'berlangsung selamanya' Anda dapat menunjukkannya.

Menggunakan 1/3 juga berfungsi tetapi 2/3 mungkin adalah contoh yang sedikit lebih baik karena pembulatan memberi Anda (misalnya) .6666667 sedangkan 0,3333333 sepertinya hanya bisa dipotong.

Michael Durrant
sumber
0

Saat melakukan perhitungan, komputer biasanya menggunakan perkiraan ke angka (seperti daripada menggunakan 1000000.7 mereka menggunakan 1000000) karena menggunakan perkiraan jauh lebih cepat. Masalahnya adalah ketika Anda melakukan perhitungan dengan perkiraan, Anda akan mendapatkan kembali perkiraan. Biasanya itu bekerja dengan cukup baik, tetapi kadang-kadang mengarah ke hasil yang tidak terduga.


sumber
Saya tidak begitu mengerti apa yang Anda katakan di sini. "Karena menggunakan perkiraan jauh lebih cepat"? Kadang-kadang bilangan bulat aritmatika setidaknya sama cepat, dan itu tepat. Terkadang tidak ada alternatif (seperti dalam mencetak akar kuadrat dari 2).
David Thornley
Baik Anda mencoba menjelaskan kepada orang pemasaran mengapa komputer tidak dapat benar-benar mewakili angka irasional, atau pada dasarnya angka apa pun dalam skema besar hal (oh dan kemudian Anda mungkin ingin memberinya ceramah singkat tentang irasionalitas \ pi: sesuatu di Seri Fourier mungkin lucu). Perkiraan adalah kata yang bisa dipahami orang. Anda mendekati ini dari sudut pandang seseorang yang tahu bahwa semua angka tidak sama.
0

Beberapa perhitungan yang dilakukan menurut beberapa aturan hukum. Misalnya, jika Anda ingin menghitung berapa banyak pajak penghasilan yang harus dibayar atas penghasilan tahunan kena pajak € 79.245,18 di Jerman, hanya ada satu jawaban yang benar. Anda bisa melakukannya dengan benar atau Anda mendapatkan salah. Jika Anda melakukannya dengan benar, Anda tidak perlu menjelaskan cara kerja aritmatika floating point. Jika Anda salah, Anda tidak perlu menjelaskan cara kerja aritmatika floating point, Anda harus memperbaiki kode yang rusak.

Kadang-kadang Anda menampilkan hasil yang tidak terlihat benar. Misalnya, jika Anda mengonversi US $ 13.297,46 ke UK £ dengan dua digit desimal, dan kemudian mengonversi jumlah UK £ itu kembali ke US $, Anda mungkin tidak mendapatkan US $ 13.297,46 tetapi US $ 13.297,45 atau US $ 13.297,47. Yang tidak ada hubungannya dengan aritmatika floating-point. Ini masalah yang tak terhindarkan dan Anda lebih bisa menjelaskan mengapa itu tidak bisa dihindari. (Anda juga harus tahu mengapa masalah tidak terjadi ketika Anda mengonversi dari UK £ ke US $ dan kembali).

Ada hasil lain yang mungkin yang tidak terlihat benar. Jika Anda mengonversi angka menjadi persentase, persentase tersebut seharusnya menambahkan hingga 100%, tetapi mungkin tidak. Jika Anda menampilkan empat persentase dengan dua desimal, empat persentase yang ditampilkan mungkin menambahkan hingga 99,99% atau 100,01%. Tidak ada hubungannya dengan aritmatika floating-point. Masih Anda harus dapat menjelaskan mengapa.

Selanjutnya, ada situasi di mana penggunaan aritmatika floating-point yang sembrono menyebabkan hasil yang tidak pantas. Misalnya, a + b + c biasanya tidak sama dengan b + c + a. Jika itu menyebabkan masalah, tidak ada yang bisa dijelaskan, itu adalah sesuatu yang Anda perbaiki.

gnasher729
sumber