Pembulatan
Kata "pembulatan" untuk nilai numerik berarti menggantinya dengan nilai lain yang kira-kira sama tetapi memiliki bentuk yang lebih pendek, lebih sederhana, atau lebih eksplisit. Misalnya, US$23.74 dapat dibulatkan menjadi US$24, atau pecahan 312/937 dapat dibulatkan menjadi 1/3, atau ungkapan 2 {\displaystyle {\sqrt {2}}} sebagai 1.41.
Pembulatan sering dilakukan dengan sengaja untuk mendapatkan nilai yang lebih mudah ditulis dan ditangani daripada aslinya. Hal ini dapat dilakukan juga untuk menunjukkan akurasi angka yang dihitung; misalnya, kuantitas yang dihitung sebagai 123.456 tetapi diketahui akurat hanya dalam beberapa ratus unit lebih baik dinyatakan sebagai "sekitar 123.500".
Di sisi lain, pembulatan dapat memperkenalkan beberapa kesalahan pembulatan dalam hasil. Pembulatan hampir tidak dapat dihindari dalam banyak perhitungan, terutama ketika membagi dua angka dalam integer atau aritmatika titik tetap; ketika menghitung fungsi matematika seperti akar kuadrat, logaritma, dan sinus; atau ketika menggunakan representasi titik mengambang dengan jumlah digit signifikan yang tetap. Dalam urutan perhitungan, kesalahan pembulatan ini umumnya terakumulasi, dan dalam kasus-kasus tertentu yang "tidak terkondisi", maka kesalahan ini dapat membuat hasilnya tidak berarti.
Pembulatan yang akurat dari fungsi matematika transendental sulit dilakukan, karena jumlah digit ekstra yang perlu dihitung untuk menentukan apakah akan dibulatkan ke atas atau ke bawah tidak dapat diketahui sebelumnya. Masalah ini dikenal sebagai "dilema pembuat tabel" (di bawah).
Pembulatan memiliki banyak kemiripan dengan kuantisasi yang terjadi ketika kuantitas fisik harus dikodekan dengan angka atau sinyal digital.
Jenis pembulatan
Masalah pembulatan yang umum adalah:
- mendekati bilangan irasional dengan pecahan, misalnya π dengan 22/7;
- mendekati pecahan dengan ekspansi desimal periodik dengan pecahan desimal terbatas, misalnya 5/3 dengan 1.6667;
- mengganti bilangan rasional dengan pecahan dengan pembilang dan penyebut yang lebih kecil, misalnya 3122/9417 dengan 1/3;
- mengganti angka desimal pecahan dengan angka yang digitnya lebih sedikit, misalnya 2,1784 dolar dengan 2,18 dolar;
- mengganti bilangan bulat desimal dengan bilangan bulat dengan lebih banyak angka nol di belakangnya, misalnya, 23.217 orang dengan 23.200 orang; atau, secara umum,
- mengganti nilai dengan kelipatan dari jumlah tertentu, misalnya 27,2 detik dengan 30 detik (kelipatan 15).
Pembulatan ke kenaikan tertentu
Jenis pembulatan yang paling umum adalah membulatkan ke bilangan bulat; atau, lebih umum lagi, ke kelipatan bilangan bulat dari beberapa kenaikan - seperti pembulatan ke sepersepuluh detik, seperseratus dolar, ke kelipatan 1/2 atau 1/8 inci, ke puluhan atau ribuan, dll..
Secara umum, membulatkan angka x ke kelipatan dari beberapa kenaikan tertentu m memerlukan langkah-langkah berikut:
- Bagilah x dengan m, biarkan hasilnya menjadi y;
- Bulatkan y ke nilai bilangan bulat, sebut saja q;
- Kalikan q dengan m untuk mendapatkan nilai bulat z.
z = r o u n d ( x , m ) = r o u n d ( x / m ) ⋅ m {\displaystyle z=\mathrm {round} (x,m)=\mathrm {round} (x/m)\cdot m\,}
Misalnya, membulatkan x = 2.1784 dolar ke sen utuh (yaitu, ke kelipatan 0.01) memerlukan penghitungan y = x/m = 2.1784/0.01 = 217.84, kemudian membulatkan y ke bilangan bulat q = 218, dan akhirnya menghitung z = q×m = 218×0.01 = 2.18.
Ketika membulatkan ke jumlah digit signifikan yang telah ditentukan, kenaikan m bergantung pada besarnya angka yang akan dibulatkan (atau hasil pembulatan).
Kenaikan m biasanya merupakan pecahan terbatas dalam sistem angka apa pun yang digunakan untuk mewakili angka-angka tersebut. Untuk tampilan kepada manusia, yang biasanya berarti sistem angka desimal (yaitu, m adalah bilangan bulat dikalikan pangkat 10, seperti 1/1000 atau 25/100). Untuk nilai antara yang disimpan dalam komputer digital, biasanya berarti sistem angka biner (m adalah bilangan bulat dikalikan pangkat 2).
Fungsi "round()" abstrak dengan satu argumen yang mengembalikan bilangan bulat dari nilai riil sembarang memiliki setidaknya selusin definisi konkret yang berbeda yang disajikan di bagian pembulatan ke bilangan bulat. Fungsi "round()" dua argumen abstrak didefinisikan secara formal di sini, tetapi dalam banyak kasus digunakan dengan nilai implisit m = 1 untuk kenaikan dan kemudian direduksi menjadi fungsi argumen tunggal abstrak yang setara, dengan selusin definisi konkret yang sama.
Pembulatan ke bilangan bulat
Bentuk pembulatan yang paling dasar adalah mengganti bilangan sembarang dengan bilangan bulat. Semua mode pembulatan berikut ini adalah implementasi konkrit dari fungsi abstrak single-argument "round()" yang disajikan dan digunakan di bagian sebelumnya.
Ada banyak cara untuk membulatkan bilangan y ke bilangan bulat q. Yang paling umum adalah
- bulatkan ke bawah (atau ambil lantai, atau bulatkan ke arah minus tak terhingga): q adalah bilangan bulat terbesar yang tidak melebihi y.
q = f l o o r ( y ) = ⌊ y ⌋ = - ⌈ - y ⌉ {\displaystyle q=\mathrm {lantai} (y)=\kiri\lantai y\right\rantai =-\kiri\lceil -y\right\rceil \,}
- membulatkan ke atas (atau mengambil batas atas, atau membulatkan ke arah plus tak terhingga): q adalah bilangan bulat terkecil yang tidak kurang dari y.
q = c e i l ( y ) = ⌈ y ⌉ = - ⌊ - y ⌋ {\displaystyle q=\mathrm {ceil} (y)=\left\lceil y\right\rceil =-\left\lfloor -y\right\rfloor \,}
- membulatkan ke arah nol (atau memotong, atau membulatkan menjauhi tak terhingga): q adalah bagian bilangan bulat dari y, tanpa digit pecahannya.
q = t r u n c a t e ( y ) = sgn ( y ) ⌊ | y | ⌋ = - sgn ( y ) ⌈ - | y | ⌉ {\displaystyle q = \mathrm {truncate} (y) = \operatorname {sgn} (y) \left\lfloor \left|y\right|\right\rfloor =-\operatorname {sgn}(y)\left\lfceil -\left|y\right|\right\rceil \,}
- bulat menjauhi nol (atau bulat menuju tak terhingga): jika y adalah bilangan bulat, q adalah y; jika tidak, q adalah bilangan bulat yang paling dekat dengan 0 dan sedemikian rupa sehingga y berada di antara 0 dan q.
q = sgn ( y ) ⌈ | y | ⌉ = - sgn ( y ) ⌊ - | y | ⌋ {\displaystyle q = \operatorname {sgn}(y)\left\lfloor -\left|y\right\right\rfloor =-\operatorname {sgn}(y)\left\lfloor -\left|y\right|\right\rfloor \,}
- bulatkan ke terdekat: q adalah bilangan bulat yang paling dekat dengan y (lihat di bawah ini untuk aturan tie-breaking).
Empat metode pertama disebut pembulatan terarah, karena perpindahan dari bilangan asli y ke nilai q yang dibulatkan semuanya diarahkan menuju atau menjauhi nilai pembatas yang sama (0, +∞, atau -∞).
Jika y positif, round-down sama dengan round-towards-zero, dan round-up sama dengan round-away-from-zero. Jika y negatif, round-down sama dengan round-away-from-zero, dan round-up sama dengan round-towards-zero. Dalam kasus apapun, jika y adalah bilangan bulat, q hanyalah y. Tabel berikut mengilustrasikan metode-metode pembulatan ini:
y | rounddown | roundup | roundtowardszero | roundaway | roundtonearest |
+23.67 | +23 | +24 | +23 | +24 | +24 |
+23.50 | +23 | +24 | +23 | +24 | +23 atau +24 |
+23.35 | +23 | +24 | +23 | +24 | +23 |
+23.00 | +23 | +23 | +23 | +23 | +23 |
0 | 0 | 0 | 0 | 0 | 0 |
-23.00 | -23 | -23 | -23 | -23 | -23 |
-23.35 | -24 | -23 | -23 | -24 | -23 |
-23.50 | -24 | -23 | -23 | -24 | -23 atau -24 |
-23.67 | -24 | -23 | -23 | -24 | -24 |
Apabila banyak perhitungan dilakukan secara berurutan, pilihan metode pembulatan dapat memiliki efek yang sangat signifikan pada hasilnya. Contoh yang terkenal melibatkan indeks baru yang dibentuk oleh Bursa Saham Vancouver pada tahun 1982. Pada awalnya ditetapkan pada 1000.000, dan setelah 22 bulan jatuh ke sekitar 520 - sedangkan harga saham secara umum meningkat dalam periode tersebut. Masalahnya disebabkan oleh indeks yang dihitung ulang ribuan kali setiap hari, dan selalu dibulatkan ke bawah hingga 3 tempat desimal, sedemikian rupa sehingga kesalahan pembulatan terakumulasi. Penghitungan ulang dengan pembulatan yang lebih baik memberikan nilai indeks 1098.892 pada akhir periode yang sama.
Pemecahan ikatan
Pembulatan sebuah bilangan y ke bilangan bulat terdekat membutuhkan beberapa aturan pemecah ikatan untuk kasus-kasus ketika y tepat setengah jalan di antara dua bilangan bulat - yaitu, ketika bagian pecahan dari y tepat 0.5.
Putaran setengah ke atas
Aturan pemecah ikatan berikut ini, yang disebut pembulatan setengah ke atas (atau pembulatan setengah ke arah plus tak terhingga), digunakan secara luas dalam banyak disiplin ilmu. Artinya, nilai setengah jalan y selalu dibulatkan ke atas.
- Jika pecahan y tepat 0,5, maka q = y + 0,5.
q = ⌊ y + 0.5 ⌋ = - ⌈ - y - 0.5 ⌉ {\displaystyle q=\kiri\lantai y + 0.5\right\rantai =-\kiri\lceil -y-0.5\right\rceil \,}
Contohnya, dengan aturan ini, nilai 23.5 dibulatkan ke 24, tetapi -23.5 dibulatkan ke -23.
Ini adalah salah satu dari dua aturan yang umumnya diajarkan di kelas matematika dasar AS. []
Jika bukan karena pecahan 0.5, kesalahan pembulatan yang diperkenalkan oleh metode pembulatan ke terdekat akan cukup simetris: untuk setiap pecahan yang dibulatkan ke atas (seperti 0.268), ada pecahan pelengkap (yaitu, 0.732) yang dibulatkan ke bawah, dengan jumlah yang sama. Ketika membulatkan sekumpulan besar angka dengan bagian pecahan acak, kesalahan pembulatan ini secara statistik akan saling mengimbangi, dan nilai yang diharapkan (rata-rata) dari angka-angka yang dibulatkan akan sama dengan nilai yang diharapkan dari angka-angka asli.
Akan tetapi, aturan pembulatan setengah ke atas tidak simetris, karena pecahan yang tepat 0.5 selalu dibulatkan ke atas. Asimetri ini memperkenalkan bias positif dalam kesalahan pembulatan. Sebagai contoh, jika pecahan y terdiri dari tiga digit desimal acak, maka nilai yang diharapkan dari q akan 0.0005 lebih tinggi dari nilai yang diharapkan dari y. Untuk alasan ini, pembulatan ke atas dengan aturan pembulatan setengah ke atas juga (secara ambigu) dikenal sebagai pembulatan asimetris.
Salah satu alasan pembulatan ke atas pada 0.5 adalah bahwa hanya satu digit yang perlu diperiksa. Ketika melihat 17.50000..., misalnya, tiga angka pertama, 17.5, menentukan bahwa angka tersebut akan dibulatkan ke atas menjadi 18. Jika aturan yang berlawanan digunakan (membulatkan setengah ke bawah), maka semua angka nol di belakang koma perlu diperiksa untuk menentukan apakah nilainya tepat 17,5.
Putaran setengah ke bawah
Seseorang juga bisa menggunakan putaran setengah ke bawah (atau putaran setengah ke arah minus tak terhingga) sebagai lawan dari putaran setengah ke atas yang lebih umum (metode putaran setengah ke atas adalah konvensi umum, tetapi tidak lebih dari sebuah konvensi).
- Jika pecahan y tepat 0,5, maka q = y - 0,5.
q = ⌈ y - 0.5 ⌉ = - ⌊ - y + 0.5 ⌋ {\displaystyle q=\kiri\lceil y-0.5\right\rceil =-\kiri\lantai -y+0.5\right\r lantai \,}
Contohnya, 23,5 dibulatkan ke 23, dan -23,5 dibulatkan ke -24.
Aturan pembulatan setengah ke bawah tidak simetris, karena pecahan-pecahan yang tepat 0.5 selalu dibulatkan ke bawah. Asimetri ini memperkenalkan bias negatif dalam kesalahan pembulatan. Sebagai contoh, jika pecahan y terdiri dari tiga digit desimal acak, maka nilai yang diharapkan dari q akan 0.0005 lebih rendah dari nilai yang diharapkan dari y. Untuk alasan ini, pembulatan ke terdekat dengan aturan pembulatan setengah ke bawah juga (secara ambigu) dikenal sebagai pembulatan asimetris.
Putaran setengah dari nol
Metode pemecah seri lainnya yang biasa diajarkan dan digunakan adalah putaran setengah menjauhi nol (atau putaran setengah menuju tak terhingga), yaitu:
- Jika pecahan y tepat 0,5, maka q = y + 0,5 jika y positif, dan q = y - 0,5 jika y negatif.
q = sgn ( y ) ⌊ | y | + 0.5 ⌋ = - sgn ( y ) ⌈ - | y | - 0.5 ⌉ {\displaystyle q = \operatorname {sgn}(y)\left\lfloor \left|y\right|+0.5\right\rfloor =-\operatorname {sgn}(y)\left\lceil -\left|y\right|-0.5\right\rceil \,}
Contohnya, 23,5 dibulatkan ke 24, dan -23,5 dibulatkan ke -24.
Metode ini memperlakukan nilai positif dan negatif secara simetris, dan oleh karena itu bebas dari bias secara keseluruhan jika angka aslinya positif atau negatif dengan probabilitas yang sama. Namun demikian, aturan ini masih akan memperkenalkan bias positif untuk angka positif, dan bias negatif untuk angka negatif.
Ini sering digunakan untuk konversi mata uang dan pembulatan harga (ketika jumlah tersebut pertama kali dikonversi ke dalam subdivisi signifikan terkecil dari mata uang, seperti sen euro) karena mudah dijelaskan hanya dengan mempertimbangkan digit pecahan pertama, terlepas dari digit presisi tambahan atau tanda jumlah (untuk kesetaraan yang ketat antara pembayar dan penerima jumlah).
Putaran setengah menuju nol
Seseorang juga dapat membulatkan setengahnya ke arah nol (atau membulatkan setengahnya menjauhi tak terhingga) sebagai kebalikan dari setengah putaran yang lebih umum menjauhi nol (metode setengah putaran menjauhi nol adalah konvensi umum, tetapi tidak lebih dari sebuah konvensi).
- Jika pecahan y tepat 0,5, maka q = y - 0,5 jika y positif, dan q = y + 0,5 jika y negatif.
q = sgn ( y ) ⌈ | y | - 0.5 ⌉ = - sgn ( y ) ⌊ - | y | + 0.5 ⌋ {\displaystyle q=\operatorname {sgn}(y)\left\lceil \left|y\right|-0.5\right\rceil =-\operatorname {sgn}(y)\left\lfloor -\left|y\right|+0.5\right\rfloor \,}
Contohnya, 23.5 dibulatkan ke 23, dan -23.5 dibulatkan ke -23.
Metode ini juga memperlakukan nilai positif dan negatif secara simetris, dan oleh karena itu, bebas dari bias secara keseluruhan jika angka aslinya positif atau negatif dengan probabilitas yang sama. Namun demikian, aturan ini masih akan memperkenalkan bias negatif untuk angka positif, dan bias positif untuk angka negatif.
Putaran setengah ke genap
Aturan tie-breaking yang bahkan tidak terlalu bias adalah putaran setengah ke genap, yaitu
- Jika pecahan y adalah 0.5, maka q adalah bilangan bulat genap yang terdekat dengan y.
Jadi, misalnya, +23,5 menjadi +24, +22,5 menjadi +22, -22,5 menjadi -22, dan -23,5 menjadi -24.
Metode ini juga memperlakukan nilai positif dan negatif secara simetris, dan oleh karena itu bebas dari bias secara keseluruhan jika angka aslinya positif atau negatif dengan probabilitas yang sama. Selain itu, untuk distribusi nilai y yang paling masuk akal, nilai yang diharapkan (rata-rata) dari angka-angka yang dibulatkan pada dasarnya sama dengan angka aslinya, bahkan jika angka-angka yang terakhir semuanya positif (atau semuanya negatif). Namun demikian, aturan ini masih akan menimbulkan bias positif untuk bilangan genap (termasuk nol), dan bias negatif untuk bilangan ganjil.
Varian dari metode round-to-nearest ini juga disebut pembulatan tidak bias (ambigu, dan sedikit kasar), pembulatan konvergen, pembulatan ahli statistik, pembulatan Belanda, pembulatan Gaussian, atau pembulatan bankir. Ini banyak digunakan dalam pembukuan.
Ini adalah mode pembulatan default yang digunakan dalam fungsi dan operator komputasi IEEE 754.
Putaran setengah ke ganjil
Aturan tie-breaking lainnya yang sangat mirip dengan babak setengah ke genap, yaitu
- Jika pecahan y adalah 0.5, maka q adalah bilangan bulat ganjil yang terdekat dengan y.
Jadi, misalnya, +22,5 menjadi +23, +21,5 menjadi +21, -21,5 menjadi -21, dan -22,5 menjadi -23.
Metode ini juga memperlakukan nilai positif dan negatif secara simetris, dan oleh karena itu bebas dari bias secara keseluruhan jika angka aslinya positif atau negatif dengan probabilitas yang sama. Selain itu, untuk distribusi nilai y yang paling masuk akal, nilai yang diharapkan (rata-rata) dari angka-angka yang dibulatkan pada dasarnya sama dengan angka aslinya, bahkan jika angka-angka aslinya semuanya positif (atau semuanya negatif). Namun demikian, aturan ini masih akan menimbulkan bias negatif untuk bilangan genap (termasuk nol), dan bias positif untuk bilangan ganjil.
Varian ini hampir tidak pernah digunakan di sebagian besar komputasi, kecuali dalam situasi di mana seseorang ingin menghindari pembulatan 0.5 atau -0.5 ke nol, atau untuk menghindari peningkatan skala angka yang direpresentasikan sebagai floating point (dengan rentang terbatas untuk eksponen penskalaan), sehingga angka yang tidak tak terbatas akan dibulatkan menjadi tak terbatas, atau bahwa nilai denormal yang kecil akan dibulatkan ke nilai normal bukan nol (ini bisa terjadi dengan mode round half to even). Secara efektif, mode ini lebih memilih mempertahankan skala angka dasi yang ada, menghindari hasil di luar jangkauan bila memungkinkan.
Pembulatan stokastik
Metode pemecah ikatan yang tidak bias lainnya adalah pembulatan stokastik:
- Jika bagian pecahan dari y adalah 0.5, pilih q secara acak di antara y + 0.5 dan y - 0.5, dengan probabilitas yang sama.
Seperti round-half-to-even, aturan ini pada dasarnya bebas dari bias secara keseluruhan; tetapi juga adil di antara nilai q genap dan ganjil. Di sisi lain, aturan ini memperkenalkan komponen acak ke dalam hasil; melakukan komputasi yang sama dua kali pada data yang sama dapat menghasilkan dua hasil yang berbeda. Juga, ini terbuka untuk bias yang tidak disadari jika manusia (bukan komputer atau perangkat kebetulan) yang "secara acak" memutuskan ke arah mana harus membulatkan.
Pemecahan seri secara bergantian
Satu metode, yang lebih tidak jelas daripada kebanyakan, adalah membulatkan setengah secara bergantian.
- Jika bagian pecahannya adalah 0,5, secara bergantian membulatkan ke atas dan membulatkan ke bawah: untuk kemunculan pertama dari bagian pecahan 0,5, bulatkan ke atas; untuk kemunculan kedua, bulatkan ke bawah; dan seterusnya dan seterusnya.
Hal ini menekan komponen acak dari hasil, jika kejadian 0,5 bagian pecahan dapat diberi nomor secara efektif. Tetapi masih bisa memperkenalkan bias positif atau negatif menurut arah pembulatan yang ditetapkan ke kejadian pertama, jika jumlah total kejadiannya ganjil.
Dithering sederhana
Dalam beberapa konteks, semua metode pembulatan di atas mungkin tidak memuaskan. Sebagai contoh, misalkan y adalah pengukuran akurat dari sinyal audio, yang dibulatkan ke bilangan bulat q untuk mengurangi biaya penyimpanan atau transmisi. Jika y berubah perlahan-lahan seiring dengan waktu, salah satu metode pembulatan di atas akan menghasilkan q yang benar-benar konstan untuk interval yang panjang, dipisahkan oleh lompatan tiba-tiba ±1. Ketika sinyal q diputar ulang, langkah-langkah ini akan terdengar sebagai noise yang sangat tidak menyenangkan, dan setiap variasi sinyal asli antara dua nilai bilangan bulat akan hilang sama sekali.
Satu cara untuk menghindari masalah ini adalah dengan membulatkan setiap nilai y ke atas dengan probabilitas yang sama dengan pecahannya, dan membulatkannya ke bawah dengan komplemen probabilitas tersebut. Sebagai contoh, angka 23.17 akan dibulatkan ke atas menjadi 24 dengan probabilitas 0.17, dan ke bawah menjadi 23 dengan probabilitas 1 - 0.17 = 0.83. (Ini setara dengan pembulatan ke bawah y + s, di mana s adalah bilangan acak yang terdistribusi secara seragam antara 0 dan 1.) Dengan pembulatan khusus ini, yang dikenal sebagai dithering, langkah tiba-tiba digantikan oleh noise yang tidak terlalu mengganggu, dan bahkan variasi kecil dalam sinyal asli akan dipertahankan sampai batas tertentu. Seperti pendekatan stokastik untuk tie-breaking, dithering tidak memiliki bias: jika semua nilai pecahan sama kemungkinannya, pembulatan ke atas dengan jumlah tertentu sama kemungkinannya dengan pembulatan ke bawah dengan jumlah yang sama; dan hal yang sama juga berlaku untuk jumlah dari beberapa angka yang dibulatkan. Di sisi lain, dithering memperkenalkan komponen acak dalam hasil, jauh lebih besar daripada hasil tie-breaking stokastik.
Lebih tepatnya, kesalahan pembulatan untuk setiap angka yang didithered akan menjadi variabel acak yang terdistribusi secara seragam dengan nilai rata-rata nol, tetapi dengan standar deviasi 1 / 12 ≈ 0.2886 {\displaystyle 1/{\sqrt {12}}\sekitar 0.2886} , yang lebih baik daripada 1/2 standar deviasi dengan metode prediktif sederhana, tetapi sedikit lebih tinggi daripada dengan metode stokastik sederhana. yang lebih baik daripada 1/2 deviasi standar dengan metode prediktif sederhana, tetapi sedikit lebih tinggi daripada metode stokastik yang lebih sederhana. Namun, jumlah n angka yang dibulatkan akan menjadi variabel acak dengan kesalahan yang diharapkan nol, tetapi dengan deviasi standar n / 12 {\displaystyle {\sqrt {n}}/{\sqrt {12}}} (total noise yang tersisa) yang menyimpang secara semi-kuadratik dan mungkin menjadi mudah terlihat, bahkan jika deviasi standar kesalahan roundoff per sampel akan menjadi 1 / 12 n {\displaystyle 1/{\sqrt {12n}}}} yang secara perlahan-lahan konvergen semi-kuadratik ke nol. Jadi, distribusi acak ini mungkin masih terlalu tinggi untuk beberapa aplikasi yang membulatkan banyak data.
Dithering multidimensi
Varian dari metode dithering sederhana ini masih membulatkan nilai dengan probabilitas yang sama dengan fraksinya. Namun demikian, alih-alih menggunakan distribusi acak untuk pembulatan sampel yang terisolasi, kesalahan pembulatan yang terjadi pada setiap sampel yang dibulatkan dijumlahkan untuk elemen-elemen di sekitarnya yang akan diambil sampelnya atau dihitung; nilai akumulasi ini kemudian ditambahkan ke nilai sampel berikutnya atau nilai yang dihitung untuk dibulatkan, sehingga nilai yang dimodifikasi akan memperhitungkan perbedaan ini dengan menggunakan model prediktif (seperti Floyd-Steinberg dithering).
Nilai-nilai yang dimodifikasi kemudian dibulatkan dengan salah satu metode pembulatan di atas, yang terbaik adalah dengan metode stokastik atau dithering: dalam kasus terakhir ini, jumlah n angka yang dibulatkan masih akan menjadi variabel acak dengan kesalahan yang diharapkan nol tetapi dengan deviasi standar konstan yang sangat baik dari 1 / 12 {\displaystyle 1/{\sqrt {12}}} , bukannya menyimpang secara semi-kuadratik ketika dithering sampel yang terisolasi; dan deviasi kesalahan roundoff rata-rata keseluruhan per sampel yang dibulatkan akan menjadi 1 / (n 12) {\displaystyle 1/(n{\sqrt {12}}})} yang akan konvergen secara hiperbolik ke nol, lebih cepat daripada dengan konvergensi semi-hiperbolik ketika dithering sampel yang terisolasi.
Dalam praktiknya, ketika membulatkan set besar data sampel (seperti audio, gambar, dan rendering video), akumulasi kesalahan roundoff paling sering digunakan dengan pembulatan prediktif sederhana dari nilai yang dimodifikasi (seperti pembulatan ke arah nol), karena masih akan mempertahankan konvergensi hiperbolik ke arah nol dari bias kesalahan roundoff rata-rata keseluruhan dan deviasi standarnya. Peningkatan ini sering digunakan dalam pemrosesan gambar dan audio (terutama untuk operasi rescaling dan antialiasing yang akurat, di mana dithering probabilistik sederhana dari nilai terisolasi masih dapat menghasilkan noise yang dapat dirasakan, kadang-kadang bahkan lebih buruk daripada efek moiré yang terjadi dengan metode pembulatan non-probabilistik sederhana yang diterapkan pada sampel yang terisolasi).
Propagasi efektif dari akumulasi kesalahan roundoff mungkin tergantung pada dimensi diskrit dari data sampel yang akan dibulatkan: ketika mengambil sampel gambar bidimensi, termasuk gambar berwarna (yang menambahkan dimensi diskrit bidang warna), atau video tridimensi (yang menambahkan dimensi waktu diskrit), atau pada data audio polifonik (menggunakan dimensi diskrit waktu dan saluran), mungkin masih lebih disukai untuk menyebarkan kesalahan ini ke arah yang disukai, atau secara merata ke dalam beberapa dimensi ortogonal, seperti secara vertikal vs. horizontal untuk gambar bidimensional, atau ke dalam saluran warna paralel pada posisi dan / atau stempel waktu yang sama, dan tergantung pada properti lain dari dimensi diskrit ortogonal ini (menurut model persepsi). Dalam kasus-kasus tersebut, beberapa akumulator kesalahan roundoff dapat digunakan (setidaknya satu untuk setiap dimensi diskrit), atau vektor (n-1) -dimensi (atau matriks) akumulator.
Dalam beberapa kasus ini, dimensi diskrit dari data yang akan diambil sampelnya dan pembulatannya dapat diperlakukan secara non ortogonal: misalnya, ketika bekerja dengan gambar berwarna, data bidang warna trikromatik dalam setiap dimensi fisik (tinggi, lebar dan opsional waktu) dapat dipetakan ulang menggunakan model warna perseptif, sehingga akumulator kesalahan pembulatan akan dirancang untuk mempertahankan kecerahan dengan probabilitas lebih tinggi daripada rona atau saturasi, alih-alih menyebarkan kesalahan ke setiap bidang warna ortogonal secara independen; dan dalam data audio stereofonik, dua saluran data yang dibulatkan (kiri dan kanan) dapat dibulatkan bersama untuk mempertahankan nilai rata-ratanya sebagai prioritas perbedaan efektifnya yang akan menyerap sebagian besar kesalahan roundoff yang tersisa, dengan cara yang seimbang di sekitar nol.
Pembulatan ke pecahan sederhana
Dalam beberapa konteks, diinginkan untuk membulatkan angka x yang diberikan ke pecahan yang "rapi" - yaitu, pecahan terdekat z = m/n yang pembilangnya m dan penyebutnya n tidak melebihi maksimum yang diberikan. Masalah ini cukup berbeda dari masalah pembulatan nilai ke sejumlah digit desimal atau biner yang tetap, atau ke kelipatan unit m. Masalah ini terkait dengan urutan Farey, pohon Stern-Brocot, dan pecahan lanjutan.
Pembulatan berskala
Jenis pembulatan ini, yang juga dinamakan pembulatan ke skala logaritmik, adalah varian dari pembulatan ke kenaikan tertentu tetapi dengan kenaikan yang dimodifikasi tergantung pada skala dan besarnya hasil. Konkretnya, maksudnya adalah untuk membatasi jumlah digit signifikan, membulatkan nilai sehingga digit yang tidak signifikan akan dihilangkan. Jenis pembulatan ini terjadi secara implisit dengan angka-angka yang dihitung dengan nilai floating-point dengan presisi terbatas (seperti IEEE-754 float dan tipe double), tetapi dapat digunakan secara lebih umum untuk membulatkan nilai real apa pun dengan jumlah digit signifikan positif dan basis real positif yang ketat.
Misalnya dapat digunakan dalam grafik teknik untuk merepresentasikan data dengan skala logaritmik dengan langkah-langkah variabel (misalnya panjang gelombang, yang basisnya tidak harus berupa ukuran bilangan bulat), atau dalam data statistik untuk mendefinisikan kelas-kelas nilai riil dalam interval dengan lebar yang tumbuh secara eksponensial (tetapi penggunaan yang paling umum adalah dengan basis bilangan bulat seperti 10 atau 2).[ source ?]
Jenis pembulatan ini didasarkan pada skala logaritmik yang ditentukan oleh faktor penskalaan riil tetap bukan nol s (dalam kasus yang paling sering terjadi, faktor ini adalah s = 1) dan basis positif tetap b>1 (tidak harus bilangan bulat dan paling sering berbeda dari faktor penskalaan), dan bilangan bulat tetap n>0 digit signifikan dalam basis itu (yang akan menentukan nilai kenaikan yang akan digunakan untuk pembulatan, bersama dengan skala efektif yang dihitung dari bilangan bulat).
Bilangan argumen utama (serta bilangan bulat yang dihasilkan) pertama-tama direpresentasikan dalam notasi eksponensial x = s-a-m-bc , sedemikian rupa sehingga tanda s adalah +1 atau -1, mantissa absolut a dibatasi pada interval positif setengah terbuka [1/b,1), dan eksponen c adalah bilangan bulat (positif atau negatif). Dalam representasi itu, semua digit signifikan berada di bagian pecahan dari mantissa absolut yang bagian bilangan bulatnya selalu nol.
Jika angka sumber (atau angka yang dibulatkan) adalah 0, mantisssa absolut a didefinisikan sebagai 0, eksponen c ditetapkan ke nilai sembarang (0 di sebagian besar konvensi, tetapi beberapa representasi floating-point tidak dapat menggunakan mantissa absolut nol tetapi mencadangkan nilai negatif maksimum tertentu untuk eksponen c untuk mewakili angka 0 itu sendiri), dan tanda s dapat dipilih secara sewenang-wenang antara -1 atau +1 (umumnya disetel ke +1 untuk nol sederhana, atau disetel ke tanda yang sama dengan argumen dalam nilai bulat jika representasi angka memungkinkan untuk membedakan nol positif dan negatif, bahkan jika mereka akhirnya mewakili nilai numerik yang sama 0).
Representasi eksponensial berskala sebagai x = a-s-bc juga dapat digunakan secara ekuivalen, dengan mantissa bertanda a sama dengan nol atau dalam salah satu dari dua interval setengah terbuka (-1,-1/b] dan [+1/b,+1), dan ini akan menjadi kasus dalam algoritma di bawah ini.
Langkah-langkah untuk menghitung pembulatan berskala ini secara umum mirip dengan yang berikut ini:
- jika x sama dengan nol, cukup kembalikan x; jika tidak:
- mengkonversi x ke dalam representasi eksponensial berskala, dengan mantissa bertanda:
x = a ⋅ s ⋅ b c {\displaystyle x=a\cdot s\cdot b^{c}\,} - biarkan x' menjadi nilai x yang tidak diskalakan, dengan membaginya dengan faktor penskalaan s:
x′ = x / s {\displaystyle x'=x/s\,} ; - biarkan eksponen penskalaan c menjadi satu ditambah logaritma basis-b dari nilai absolut x', dibulatkan ke bawah ke bilangan bulat (menuju minus tak terhingga):
c = 1 + ⌊ log b | x ′ | ⌋ = 1 + ⌊ log b | x / s | ⌋ {\displaystyle c = 1 + \\kiri\lfloor \log _{b}\kiri|x'\right|\right\rfloor =1 + \\kiri\lfloor \log _{b}\kiri|x /s\right|\right\rfloor \,} ; - biarkan mantissa bertanda tangan a menjadi hasil kali x' dibagi dengan b pangkat c:
a = x ′ ⋅ b - c = x / s ⋅ b - c {\displaystyle a=x'\cdot b^{-c}=x/s\cdot b^{-c}}\,} - menghitung nilai bulat dalam representasi ini:
- biarkan c' menjadi eksponen penskalaan awal c dari x':
c′ = c {\displaystyle c'=c\,} - biarkan m menjadi kenaikan untuk membulatkan mantissa a sesuai dengan jumlah digit signifikan yang harus dipertahankan:
m = b - n {\displaystyle m=b^{-n}\,} - biarkan a' menjadi mantissa bertanda a yang dibulatkan sesuai dengan kenaikan m dan mode pembulatan yang dipilih:
a ′ = r o u n d ( a , m ) = r o u n d ( x / s ⋅ b n - c ′ ) ⋅ b - n {\displaystyle a'=\mathrm {round} (a,m)=\mathrm {round} (x/s\cdot b^{n-c'})\cdot b^{-n}\,} - jika nilai absolut a' tidak lebih rendah dari b, maka decrement n (kalikan increment m dengan b), increment eksponen penskalaan c', bagi mantissa bertanda tangan a dengan b, dan mulai kembali pembulatan mantissa bertanda tangan baru a menjadi a' dengan rumus yang sama; langkah ini dapat dihindari hanya jika fungsi abtract "round()" selalu membulatkan a ke arah 0 (yaitue. ketika itu adalah pemotongan sederhana), tetapi diperlukan jika mungkin pembulatan a menuju tak terhingga, karena mantissa yang dibulatkan mungkin memiliki eksponen penskalaan yang lebih tinggi dalam kasus ini, menyisakan digit ekstra presisi.
- mengembalikan nilai yang dibulatkan:
y = s c a l e d r o u n d ( x , s , b , n ) = a ′ ⋅ s ⋅ b c ′ = r o u n d ( x / s ⋅ b n - c ′ ) ⋅ s ⋅ b c ′ - n {\displaystyle y=\mathrm {scaledround} (x,s,b,n)=a'\cdot s\cdot b^{c'}=\mathrm {round} (x/s\cdot b^{n-c'})\cdot s\cdot b^{c'-n}\,} .
Untuk fungsi abstrak "round()", jenis pembulatan ini dapat menggunakan salah satu mode pembulatan ke integer yang dijelaskan lebih lengkap di bagian berikutnya, tetapi yang paling sering adalah mode pembulatan ke terdekat (dengan aturan tie-breaking juga dijelaskan lebih lengkap di bawah).
Contohnya:
- pembulatan berskala 1.234 dengan faktor penskalaan 1 dalam basis 10 dan 3 digit signifikan (presisi relatif maksimum = 1/1000), ketika menggunakan mode pembulatan ke terdekat, akan menghasilkan 1.23;
- pembulatan skala serupa dari 1,236 akan menghasilkan 1,24;
- pembulatan skala yang serupa dari 21,236 akan menghasilkan 21,2;
- pembulatan skala serupa dari 321.236 akan menghasilkan 321;
- pembulatan berskala 1.234 faktor penskalaan 1 dalam basis 10 dan 3 digit signifikan (presisi relatif maksimum = 1/1000), ketika menggunakan mode pembulatan ke bawah, akan menghasilkan 1.23;
- pembulatan skala yang sama dari 1,236 juga akan menghasilkan 1,23;
- pembulatan berskala 3 π / 7 ≈ 6.8571 ⋅ π ⋅ 2 - 4 {\displaystyle \scriptstyle 3\pi /7\;\approx \;6.8571\cdot \pi \cdot 2^{-4}} dengan faktor penskalaan π {\displaystyle \scriptstyle \pi } dalam basis 2 dan 3 digit signifikan (presisi relatif maksimum = 1/8), ketika menggunakan mode pembulatan ke bawah, akan mengembalikan 6 ⋅ π ⋅ 2 - 4 = 3 π / 8 {\displaystyle \scriptstyle 6\cdot \pi \cdot 2^{-4}}\;=\;3\pi /8} ;
- pembulatan skala serupa dari 5 π / 7 ≈ 5.7143 ⋅ π ⋅ 2 - 3 {\displaystyle \scriptstyle 5\pi /7\;\approx \;5.7143\cdot \pi \cdot 2^{-3}} akan mengembalikan 5 ⋅ π ⋅ 2 - 3 = 5 π / 8 {\displaystyle \scriptstyle 5\cdot \pi \cdot 2^{-3}\;=\;5\pi /8} ;
- pembulatan skala serupa dari π / 7 ≈ 4.5714 ⋅ π ⋅ 2 - 5 {\displaystyle \scriptstyle \pi /7\;\approx \;4.5714\cdot \pi \cdot 2^{-5}} akan mengembalikan 4 ⋅ π ⋅ 2 - 5 = π / 8 {\displaystyle \scriptstyle 4\cdot \pi \cdot 2^{-5}\;=\;\pi /8} .
- pembulatan skala serupa dari π / 8 = 4 ⋅ π ⋅ 2 - 5 {\displaystyle \scriptstyle \pi /8\;=\;4\cdot \pi \cdot 2^{-5}} juga akan mengembalikan 4 ⋅ π ⋅ 2 - 5 = π / 8 {\displaystyle \scriptstyle 4\cdot \pi \cdot 2^{-5}\;=\;\pi /8}} .
- pembulatan skala serupa dari π / 15 ≈ 4.2667 ⋅ π ⋅ 2 - 6 {\displaystyle \scriptstyle \pi /15\;\approx \;4.2667\cdot \pi \cdot 2^{-6}} akan mengembalikan 4 ⋅ π ⋅ 2 - 6 = π / 16 {\displaystyle \scriptstyle 4\cdot \pi \cdot 2^{-6}\;=\;\pi /16}. .
Bulatkan ke nilai yang tersedia
Kayu jadi, kertas tulis, kapasitor, dan banyak produk lainnya biasanya dijual hanya dalam beberapa ukuran standar.
Banyak prosedur desain yang menjelaskan cara menghitung nilai perkiraan, dan kemudian "membulatkan" ke beberapa ukuran standar dengan menggunakan frasa seperti "bulatkan ke bawah ke nilai standar terdekat", "bulatkan ke atas ke nilai standar terdekat", atau "bulatkan ke nilai standar terdekat".
Apabila sekumpulan nilai pilihan memiliki jarak yang sama pada skala logaritmik, Memilih nilai pilihan yang paling dekat dengan nilai yang diberikan dapat dilihat sebagai semacam pembulatan berskala. Nilai-nilai yang "dibulatkan" seperti itu bisa langsung dihitung.
Pembulatan titik-terapung
Dalam aritmatika floating-point, pembulatan bertujuan untuk mengubah nilai x yang diberikan menjadi nilai z dengan jumlah digit signifikan yang ditentukan. Dengan kata lain, z harus merupakan kelipatan dari angka m yang tergantung pada besarnya z. Angka m adalah pangkat dari basis (biasanya 2 atau 10) dari bentuk floating-point.
Terlepas dari detail ini, semua varian pembulatan yang dibahas di atas berlaku juga untuk pembulatan bilangan floating-point. Algoritma untuk pembulatan seperti itu disajikan dalam bagian Scaled rounding di atas, tetapi dengan faktor penskalaan konstan s = 1, dan basis bilangan bulat b>1.
Untuk hasil dimana hasil pembulatan akan melimpah, hasil untuk pembulatan terarah adalah tak terhingga bertanda yang sesuai, atau bilangan berhingga positif tertinggi yang dapat direpresentasikan (atau bilangan berhingga negatif terendah yang dapat direpresentasikan jika x negatif), tergantung arah pembulatan. Hasil dari luapan untuk kasus biasa pembulatan ke genap selalu merupakan tak terhingga yang sesuai.
Selain itu, jika hasil pembulatan akan underflow, yaitu jika eksponen akan melebihi nilai integer terendah yang dapat diwakili, hasil efektifnya mungkin nol (mungkin ditandatangani jika representasi dapat mempertahankan perbedaan tanda untuk nol), atau bilangan terbatas positif terkecil yang dapat diwakili (atau bilangan terbatas negatif tertinggi yang dapat diwakili jika x negatif), mungkin bilangan positif atau negatif denormal (jika mantissa menyimpan semua digit signifikannya, dalam hal ini digit yang paling signifikan masih dapat disimpan di posisi yang lebih rendah dengan mengatur digit tertinggi yang tersimpan ke nol, dan mantissa yang tersimpan ini tidak menjatuhkan digit yang paling signifikan, sesuatu yang mungkin terjadi ketika basis b = 2 karena digit yang paling signifikan selalu 1 dalam basis itu), tergantung pada arah pembulatan. Hasil dari underflow untuk kasus pembulatan biasa ke genap selalu nol yang sesuai.
Pembulatan ganda
Membulatkan sebuah bilangan dua kali berturut-turut ke presisi yang berbeda, dengan presisi terakhir yang lebih kasar, tidak dijamin memberikan hasil yang sama dengan pembulatan sekali ke presisi akhir kecuali dalam kasus pembulatan terarah. Misalnya pembulatan 9.46 ke satu desimal memberikan 9.5, dan kemudian 10 ketika pembulatan ke bilangan bulat menggunakan pembulatan setengah ke genap, tetapi akan memberikan 9 ketika dibulatkan ke bilangan bulat secara langsung.
Beberapa bahasa komputer dan standar IEEE 754-2008 menentukan bahwa dalam perhitungan langsung, hasilnya tidak boleh dibulatkan dua kali. Ini telah menjadi masalah khusus dengan Java karena dirancang untuk dijalankan secara identik pada mesin yang berbeda, trik pemrograman khusus harus digunakan untuk mencapai hal ini dengan floating point x87. Bahasa Java diubah untuk memungkinkan hasil yang berbeda di mana perbedaannya tidak masalah dan memerlukan kualifikasi "strictfp" untuk digunakan ketika hasilnya harus sesuai secara akurat.
Komputasi eksak dengan aritmatika bulat
Dimungkinkan untuk menggunakan aritmetika bulat untuk mengevaluasi nilai yang tepat dari suatu fungsi dengan domain dan rentang diskrit. Misalnya, jika kita tahu bahwa bilangan bulat n adalah kuadrat sempurna, kita dapat menghitung akar kuadratnya dengan mengubah n menjadi nilai floating-point x, menghitung perkiraan akar kuadrat y dari x dengan floating point, dan kemudian membulatkan y ke bilangan bulat terdekat q. Jika n tidak terlalu besar, kesalahan pembulatan floating-point di y akan kurang dari 0,5, sehingga nilai q yang dibulatkan akan menjadi akar kuadrat yang tepat dari n. Di sebagian besar komputer modern, metode ini mungkin jauh lebih cepat daripada menghitung akar kuadrat n dengan algoritma bilangan bulat semua.
Dilema pembuat meja
William Kahan menciptakan istilah "The Table-Maker's Dilemma" untuk biaya pembulatan fungsi transendental yang tidak diketahui:
"Tidak ada yang tahu berapa biaya yang diperlukan untuk menghitung y^w yang dibulatkan dengan benar untuk setiap dua argumen floating-point yang tidak over/underflow. Sebaliknya, perpustakaan matematika terkemuka menghitung fungsi-fungsi transendental dasar sebagian besar dalam waktu sedikit lebih dari setengah ulp dan hampir selalu dalam satu ulp. Mengapa Y^W tidak bisa dibulatkan dalam setengah ulp seperti SQRT? Karena tidak ada yang tahu berapa banyak komputasi yang diperlukan... Tidak ada cara umum yang ada untuk memprediksi berapa banyak digit tambahan yang harus dibawa untuk menghitung ekspresi transendental dan membulatkannya dengan benar ke beberapa jumlah digit yang telah ditentukan sebelumnya. Bahkan fakta (jika benar) bahwa jumlah digit ekstra yang terbatas pada akhirnya akan mencukupi mungkin merupakan teorema yang mendalam."
Standar floating point IEEE menjamin bahwa penambahan, pengurangan, perkalian, pembagian, akar kuadrat, dan sisa floating point akan memberikan hasil pembulatan yang benar dari operasi presisi tak terbatas. Namun, tidak ada jaminan seperti itu yang diberikan untuk fungsi yang lebih kompleks dan biasanya hanya akurat hingga bit terakhir.
Dengan menggunakan teorema Gelfond-Schneider dan teorema Lindemann-Weierstrass, banyak fungsi dasar standar dapat dibuktikan untuk mengembalikan hasil transendental ketika diberikan argumen rasional bukan nol; oleh karena itu selalu mungkin untuk membulatkan fungsi tersebut dengan benar. Namun menentukan batas untuk presisi tertentu tentang seberapa akurat hasil yang perlu dihitung sebelum hasil pembulatan yang benar dapat dijamin dapat menuntut banyak waktu komputasi.
Sekarang ada beberapa paket yang menawarkan akurasi penuh. Paket MPFR memberikan hasil presisi sembarang yang dibulatkan dengan benar. IBM telah menulis paket untuk fungsi-fungsi elementer IEEE yang cepat dan akurat dan di masa depan pustaka standar mungkin menawarkan presisi seperti itu.
Adalah mungkin untuk membuat angka-angka yang dapat dihitung dengan baik yang mungkin tidak akan pernah dapat dibulatkan dengan benar, tidak peduli berapa banyak digit yang dihitung. Sebagai contoh, jika dugaan Goldbach benar tetapi tidak dapat dibuktikan, maka tidak mungkin untuk membulatkan ke bawah 0,5 + 10-n dengan benar di mana n adalah bilangan genap pertama yang lebih besar dari 4 yang bukan merupakan jumlah dari dua bilangan prima, atau 0,5 jika tidak ada bilangan tersebut. Namun, ini dapat didekati dengan presisi tertentu bahkan jika dugaannya tidak dapat dibuktikan.
Sejarah
Konsep pembulatan sudah sangat tua, bahkan mungkin lebih tua dari konsep pembagian. Beberapa tablet tanah liat kuno yang ditemukan di Mesopotamia berisi tabel-tabel dengan nilai bulat dari resiprokal dan akar kuadrat dalam basis 60. Perkiraan bulat untuk π, panjang tahun, dan panjang bulan juga kuno.
Metode Round-to-even telah menjadi standar ASTM (E-29) sejak tahun 1940. Asal mula istilah pembulatan tak bias dan pembulatan statistik cukup jelas. Dalam Probabilitas dan Teori Kesalahan edisi ke-4 tahun 1906, Robert Simpson Woodward menyebutnya "aturan komputer" yang menunjukkan bahwa hal itu kemudian digunakan secara umum oleh komputer manusia yang menghitung tabel matematika. Makalah Churchill Eisenhart tahun 1947 "Effects of Rounding or Grouping Data" (dalam Selected Techniques of Statistical Analysis, McGrawHill, 1947, Eisenhart, Hastay, dan Wallis, editor) mengindikasikan bahwa praktik ini sudah "mapan" dalam analisis data.
Asal-usul istilah "pembulatan bankir" masih lebih tidak jelas. Jika metode pembulatan ini pernah menjadi standar dalam perbankan, buktinya terbukti sangat sulit ditemukan. Sebaliknya, bagian 2 dari laporan Komisi Eropa, Pengenalan Euro dan Pembulatan Jumlah Mata Uang, menunjukkan bahwa sebelumnya tidak ada pendekatan standar untuk pembulatan dalam perbankan; dan laporan ini menetapkan bahwa jumlah "setengah jalan" harus dibulatkan ke atas.
Sampai tahun 1980-an, metode pembulatan yang digunakan dalam aritmatika komputer floating-point biasanya ditetapkan oleh perangkat keras, tidak terdokumentasi dengan baik, tidak konsisten, dan berbeda untuk setiap merek dan model komputer. Situasi ini berubah setelah standar floating point IEEE 754 diadopsi oleh sebagian besar produsen komputer. Standar ini memungkinkan pengguna untuk memilih di antara beberapa mode pembulatan, dan dalam setiap kasus, menentukan dengan tepat bagaimana hasilnya harus dibulatkan. Fitur-fitur ini membuat komputasi numerik lebih mudah diprediksi dan tidak bergantung pada mesin, dan memungkinkan implementasi aritmatika interval yang efisien dan konsisten.
Fungsi pembulatan dalam bahasa pemrograman
Kebanyakan bahasa pemrograman menyediakan fungsi atau sintaks khusus untuk membulatkan bilangan pecahan dengan berbagai cara. Bahasa numerik paling awal, seperti FORTRAN dan C, hanya akan menyediakan satu metode, biasanya pemotongan (menuju nol). Metode default ini dapat diimplikasikan dalam konteks tertentu, seperti saat menetapkan bilangan pecahan ke variabel integer, atau menggunakan bilangan pecahan sebagai indeks array. Jenis pembulatan lainnya harus diprogram secara eksplisit; misalnya, pembulatan bilangan positif ke bilangan bulat terdekat dapat diimplementasikan dengan menambahkan 0,5 dan memotong.
Dalam beberapa dekade terakhir, bagaimanapun juga, sintaks dan/atau libraries standar dari kebanyakan bahasa umumnya telah menyediakan paling tidak empat fungsi pembulatan dasar (atas/langit-langit, bawah/lantai, ke terdekat, dan menuju nol). Metode tie-breaking dapat bervariasi tergantung bahasa dan versinya, dan/atau dapat dipilih oleh programmer. Beberapa bahasa mengikuti petunjuk standar floating-point IEEE-754, dan mendefinisikan fungsi-fungsi ini sebagai mengambil argumen float presisi ganda dan mengembalikan hasil dari tipe yang sama, yang kemudian dapat dikonversi ke integer jika perlu. Karena format presisi ganda IEEE memiliki 52 bit pecahan, pendekatan ini dapat menghindari luapan palsu dalam bahasa yang memiliki bilangan bulat 32-bit. Beberapa bahasa, seperti PHP, menyediakan fungsi yang membulatkan nilai ke sejumlah digit desimal tertentu, misalnya dari 4321.5678 menjadi 4321.57 atau 4300. Selain itu, banyak bahasa menyediakan fungsi "printf" atau fungsi pemformatan string serupa, yang memungkinkan seseorang untuk mengubah angka pecahan menjadi string, dibulatkan ke sejumlah tempat desimal yang ditentukan pengguna (presisi). Di sisi lain, pemotongan (pembulatan ke nol) masih merupakan metode pembulatan default yang digunakan oleh banyak bahasa, terutama untuk pembagian dua nilai integer.
Sebaliknya, CSS dan SVG tidak mendefinisikan presisi maksimum spesifik apa pun untuk angka dan pengukuran, yang diperlakukan dan diekspos dalam Model Objek Dokumen mereka dan dalam antarmuka bahasa deskripsi antarmuka mereka sebagai string seolah-olah mereka memiliki presisi tak terbatas, dan tidak membedakan antara bilangan bulat dan nilai titik apung; namun, implementasi bahasa-bahasa ini biasanya akan mengubah angka-angka ini menjadi titik apung ganda IEEE-754 sebelum mengekspos digit yang dihitung dengan presisi terbatas (terutama dalam binding antarmuka Javascript atau ECMAScript standar).
Standar pembulatan lainnya
Beberapa disiplin ilmu atau institusi telah mengeluarkan standar atau arahan untuk pembulatan.
Pengamatan Cuaca A.S.
Dalam sebuah pedoman yang dikeluarkan pada pertengahan tahun 1966, Kantor Koordinator Federal untuk Meteorologi AS menetapkan bahwa data cuaca harus dibulatkan ke angka bulat terdekat, dengan aturan "round half up" tie-breaking. Misalnya, 1,5 dibulatkan ke bilangan bulat menjadi 2, dan -1,5 menjadi -1. Sebelum tanggal tersebut, aturan pemecah ikatan adalah "bulatkan setengah dari nol".
Nol negatif dalam meteorologi
Beberapa ahli meteorologi mungkin menulis "-0" untuk menunjukkan suhu antara 0,0 dan -0,5 derajat (eksklusif) yang dibulatkan menjadi bilangan bulat. Notasi ini digunakan ketika tanda negatif dianggap penting, tidak peduli seberapa kecil besarnya; misalnya, ketika pembulatan suhu dalam skala Celcius, di mana di bawah nol menunjukkan titik beku. []
Halaman terkait
Pertanyaan dan Jawaban
T: Apa arti kata "pembulatan"?
J: Pembulatan adalah mengganti nilai numerik dengan nilai lain yang kurang lebih sama tetapi memiliki bentuk yang lebih pendek, lebih sederhana, atau lebih eksplisit.
T: Apa contoh pembulatan?
J: Contoh pembulatan adalah US$23,74 dibulatkan menjadi US$24, pecahan 312/937 dibulatkan menjadi 1/3, dan ekspresi 2 {\displaystyle {\sqrt {2}}} dibulatkan menjadi 1,41.
T: Mengapa kita membulatkan angka?
J: Kita membulatkan angka untuk mendapatkan nilai yang lebih mudah ditulis dan ditangani daripada aslinya. Hal ini juga dapat dilakukan untuk menunjukkan keakuratan angka yang dihitung.
T: Apa saja masalah potensial dengan pembulatan?
J: Pembulatan dapat menimbulkan beberapa kesalahan pembulatan sebagai akibatnya dan dalam kasus-kasus tertentu, hal ini dapat membuat hasilnya tidak berarti karena kesalahan yang terakumulasi dari waktu ke waktu dalam perhitungan. Selain itu, pembulatan yang akurat dari fungsi matematika transendental bisa jadi sulit karena tidak mungkin mengetahui berapa banyak digit ekstra yang perlu dihitung untuk menyelesaikan apakah akan membulatkan ke atas atau ke bawah sebelumnya.
T: Bagaimana pembulatan berhubungan dengan kuantisasi?
J: Pembulatan memiliki banyak kemiripan dengan kuantisasi yang terjadi ketika kuantitas fisik harus dikodekan dengan angka atau sinyal digital.