Inilah kunci untuk kesulitan Anda: 10
adalah produk dari 2
dan 5
. Anda dapat mewakili angka apa pun persis di basis 10 desimal yaitu k * 1/2 n * 1/5 m di mana k
, n
dan m
bilangan bulat.
Alternatif lain - jika angka n
dalam 1 / n berisi faktor yang bukan bagian dari faktor basis, angka tersebut tidak akan dapat direpresentasikan secara tepat dalam jumlah digit tetap dalam biner / desimal / ekspansi apa pun dari itu nomor - itu akan memiliki bagian yang berulang. Misalnya 1/15 = 0,0666666666 .... karena 3 (15 = 3 * 5) bukan merupakan faktor 10.
Dengan demikian, apa pun yang dapat direpresentasikan dalam basis 2 dengan tepat (k * 1/2 n ) dapat direpresentasikan dalam basis 10 dengan tepat.
Di luar itu, ada masalah tentang berapa digit / bit yang Anda gunakan untuk mewakili angka. Ada beberapa angka yang dapat direpresentasikan dengan tepat di beberapa basis, tetapi dibutuhkan lebih dari beberapa angka / bit untuk melakukannya.
Dalam biner, angka 1/10 yang dengan mudah 0,1 dalam desimal tidak dapat direpresentasikan sebagai angka yang dapat direpresentasikan dalam jumlah bit tetap dalam biner. Sebaliknya, angkanya adalah 0,00011001100110011 ... 2 (dengan bagian 0011 berulang selamanya).
Mari lihat nomor 1 2 /1010 2 sedikit lebih dekat.
____
0,00011
+ ---------
1010 | 1,00000
0
-
1 0
0
----
1 00 --------- +
0 |
----- |
1 000 |
0 |
------ | mengulangi
1 0000 | blok
1010 |
------ |
1100 |
1010 |
---- |
100 ---- +
Ini adalah jenis yang persis sama dengan yang Anda dapatkan ketika Anda mencoba melakukan pembagian panjang untuk 1/3.
1/10, ketika diperhitungkan adalah 1 / (2 1 * 5 1 ). Untuk basis 10 (atau kelipatan 10), angka ini berakhir dan dikenal sebagai angka biasa . Ekspansi desimal yang berulang dikenal sebagai desimal berulang , dan angka-angka yang berlangsung selamanya tanpa berulang adalah angka yang tidak rasional.
The matematika di balik ini menggali teorema kecil Fermat ... dan setelah Anda mulai mengatakan Fermat atau teorema, itu menjadi pertanyaan Math.SE .
Apakah ada angka yang tidak terwakili dalam basis 10 tetapi dapat diwakili dalam basis 2?
Jawabannya adalah tidak'.
Jadi, pada titik ini kita semua harus jelas bahwa setiap ekspansi biner panjang tetap dari bilangan rasional dapat direpresentasikan sebagai ekspansi desimal panjang tetap.
Mari kita melihat lebih dekat pada desimal dalam C # yang membawa kita ke desimal floating point di .NET dan memberi penulis, saya akan menerima bahwa itulah cara kerjanya.
Tipe desimal memiliki komponen yang sama dengan nomor floating point lainnya: mantissa, eksponen dan tanda. Seperti biasa, tandanya hanya satu bit, tetapi ada 96 bit mantissa dan 5 bit eksponen. Namun, tidak semua kombinasi eksponen valid. Hanya nilai 0-28 yang berfungsi, dan semuanya efektif negatif: nilai numeriknya . Ini berarti nilai maksimum dan minimum dari tipe adalah +/- (2 96 -1), dan angka non-nol terkecil dalam hal besarnya absolut adalah 10 -28 .sign * mantissa / 10exponent
Saya akan segera menunjukkan bahwa karena implementasi ini ada angka dalam double
jenis yang tidak dapat diwakili decimal
- mereka yang berada di luar jangkauan. Double.Epsilon
adalah 4.94065645841247e-324
yang tidak dapat direpresentasikan dalam decimal
, tetapi dapat dalam double
.
Namun, dalam rentang yang dapat mewakili desimal, ia memiliki lebih banyak bit presisi daripada jenis asli lainnya dan dapat mewakili mereka tanpa kesalahan.
Ada beberapa jenis lain yang beredar. Ada BigInteger di C # yang dapat mewakili integer besar yang sewenang-wenang. Tidak ada yang setara dengan BigDecimal Java (yang dapat mewakili angka dengan angka desimal hingga 2 32 digit - yang merupakan rentang yang cukup besar) tepatnya . Namun, jika Anda melihat sedikit, Anda bisa menemukan implementasi linting tangan.
Ada beberapa bahasa yang juga memiliki tipe data rasional yang memungkinkan Anda untuk secara tepat mewakili rasional (sehingga 1/3 sebenarnya 1/3).
Khusus untuk C # dan pilihan float atau rasional, saya akan tunduk kepada Jon Skeet dari desimal floating pint di .NET :
Sebagian besar aplikasi bisnis mungkin harus menggunakan desimal daripada float atau double. Aturan praktis saya adalah bahwa nilai-nilai buatan manusia seperti mata uang biasanya lebih baik diwakili dengan floating point desimal: konsep persis 1,25 dolar sepenuhnya masuk akal, misalnya. Untuk nilai-nilai dari dunia alami, seperti panjang dan berat, jenis titik mengambang biner lebih masuk akal. Meskipun ada teori "tepat 1,25 meter" itu tidak akan pernah terjadi dalam kenyataan: Anda tentu tidak akan pernah bisa mengukur panjang yang tepat, dan mereka bahkan tidak mungkin ada di tingkat atom. Kami terbiasa ada toleransi tertentu yang terlibat.