Ada banyak cara untuk menyimpan bilangan pecahan, dan masing-masing memiliki kelebihan dan kekurangan.
Sejauh ini, Floating-point adalah format yang paling populer. Ia bekerja dengan mengkodekan tanda, mantissa, dan basis-2 eksponen yang ditandatangani ke dalam bilangan bulat, dan mengemasnya menjadi banyak bit. Misalnya, Anda bisa memiliki mantissa 32-bit dari 0.5
(dikodekan sebagai 0x88888888
) dan eksponen ditandatangani 32-bit dari +3
( 0x00000003
), yang akan diterjemahkan ke 4.0
(0.5 * 2 ^ 3
). Angka floating-point cepat, karena diimplementasikan dalam perangkat keras, dan skala ketepatannya dengan ukuran absolut, yaitu, semakin kecil angkanya, semakin baik presisi absolut Anda, sehingga kesalahan pembulatan relatif tetap konstan dengan ukuran absolut. Mengapung sangat bagus untuk nilai sampel dari domain kontinu, seperti panjang, tingkat tekanan suara, tingkat cahaya, dll. Dan karena itu, mereka biasanya digunakan dalam pemrosesan audio dan gambar, serta analisis statistik dan simulasi fisika. Kelemahan terbesar mereka adalah bahwa mereka tidak tepat, yaitu, mereka rentan terhadap kesalahan pembulatan, dan mereka tidak dapat secara akurat mewakili semua pecahan desimal. Semua bahasa pemrograman arus utama memiliki semacam float point.
Titik pastibekerja dengan menggunakan bilangan bulat yang cukup besar dan secara implisit memesan bagian dari bit mereka untuk bagian fraksional. Misalnya, angka tetap-titik 24,8 bit cadangan 24 bit untuk bagian integer (termasuk tanda), dan 8 bit untuk bagian fraksional. Menggeser kanan angka tersebut dengan 8 bit memberi kita bagian integer. Nomor fixed-point dulu populer ketika unit floating-point perangkat keras tidak umum atau setidaknya jauh lebih lambat daripada rekan-rekan integer mereka. Sementara angka titik tetap agak lebih mudah untuk ditangani dalam hal ketepatan (jika hanya karena mereka lebih mudah untuk dipikirkan), mereka lebih rendah daripada mengapung di hampir semua hal lainnya - mereka memiliki presisi kurang, jangkauan yang lebih kecil, dan karena tambahan operasi diperlukan untuk memperbaiki perhitungan untuk pergeseran implisit, matematika fixed-point saat ini sering lebih lambat daripada matematika floating-point.
Tipe desimal bekerja seperti float atau angka titik tetap, tetapi mereka menganggap sistem desimal, yaitu eksponen mereka (tersirat atau eksplisit) mengkodekan kekuatan-of-10, bukan kekuatan-of-2. Bilangan desimal dapat, misalnya, menyandikan mantissa 23456
dan eksponen -2
, dan ini akan meluas ke234.56
. Desimal, karena aritmatika tidak terprogram ke dalam CPU, lebih lambat daripada float, tetapi mereka ideal untuk apa pun yang melibatkan angka desimal dan membutuhkan angka-angka itu dengan tepat, dengan pembulatan terjadi di tempat-tempat yang ditentukan dengan baik - perhitungan keuangan, scoreboards, dll. Beberapa bahasa pemrograman memiliki tipe desimal yang dibangun di dalamnya (misalnya C #), yang lain membutuhkan perpustakaan untuk mengimplementasikannya. Perhatikan bahwa sementara desimal dapat secara akurat mewakili pecahan desimal yang tidak berulang, ketepatannya tidak lebih baik daripada bilangan floating-point; memilih desimal hanya berarti Anda mendapatkan representasi angka yang tepat yang dapat direpresentasikan dengan tepat dalam sistem desimal (seperti float dapat mewakili fraksi biner).
Bilangan rasional menyimpan pembilang dan penyebut, biasanya menggunakan beberapa jenis tipe bignum integer (tipe numerik yang dapat tumbuh sebesar yang diizinkan oleh batasan memori komputer). Ini adalah satu-satunya tipe data dari kumpulan yang dapat secara akurat memodelkan angka seperti 1/3
atau 3/17
, serta operasi pada mereka - rasional, tidak seperti tipe data lainnya, akan menghasilkan hasil yang benar untuk hal-hal seperti3 * 1/3
. Perhitungannya cukup mudah, meskipun menghasilkan algoritma anjak piutang yang efisien agak sulit. Beberapa bahasa pemrograman memiliki tipe rasional yang dibangun di dalamnya (misalnya Common Lisp). Kelemahan dari rasional termasuk bahwa mereka lambat (banyak operasi membutuhkan pengurangan fraksi dan memfaktorkan komponen mereka), dan bahwa banyak operasi umum sulit atau tidak mungkin untuk dilaksanakan, dan sebagian besar implementasi akan menurunkan rasional ke float ketika ini terjadi (misalnya ketika Anda menelepon sin()
secara rasional).
BCD (Binary Coded Decimal) menggunakan "nibbles" (kelompok 4 bit) untuk mengkodekan masing-masing digit; karena nibble dapat menampung 16 nilai yang berbeda, tetapi angka desimal hanya membutuhkan 10, ada 6 nilai "ilegal" per nibble. Seperti desimal, angka BCD adalah tepat desimal, yaitu, perhitungan yang dilakukan pada angka desimal bekerja seperti yang akan mereka lakukan jika Anda melakukannya dengan menggunakan pena dan kertas. Aturan aritmatika untuk BCD agak kikuk, tetapi sisi baiknya adalah mengubahnya menjadi string lebih mudah daripada dengan beberapa format lain, yang sangat menarik untuk lingkungan sumber daya rendah seperti sistem embedded.
String , ya, string lama polos, juga dapat digunakan untuk mewakili angka fraksional. Secara teknis, ini sangat mirip dengan BCD, hanya saja ada titik desimal eksplisit, dan Anda menggunakan satu byte penuh per digit desimal. Karena itu, formatnya boros (hanya 11 dari 256 nilai yang mungkin digunakan), tetapi lebih mudah untuk menguraikan dan menghasilkan daripada BCD. Selain itu, karena semua nilai yang digunakan adalah angka "tidak mencurigakan", tidak berbahaya, dan platform-netral, string-encoded dapat melakukan perjalanan melalui jaringan tanpa masalah. Jarang menemukan aritmatika dilakukan pada string secara langsung, tetapi itu mungkin, dan ketika Anda melakukannya, mereka hanya sama persis dengan desimal seperti format desimal lainnya (desimal dan BCD).