Apakah ada angka yang tidak terwakili dalam basis 10 tetapi dapat diwakili dalam basis 2?

42

C#memiliki decimaltipe yang digunakan untuk angka-angka yang membutuhkan representasi tepat dalam basis 10. Misalnya, 0.1tidak dapat direpresentasikan dalam basis 2 (misalnya floatdan double) dan akan selalu menjadi perkiraan ketika disimpan dalam variabel yang merupakan tipe ini.

Saya bertanya-tanya apakah fakta yang terbalik juga mungkin terjadi. Apakah ada angka yang tidak dapat diwakili dalam basis 10 tetapi dapat diwakili dalam basis 2 (dalam hal ini saya ingin menggunakan floatbukan decimaluntuk menangani mereka)?

Maks
sumber
14
Memberi +1 pada pertanyaan, tetapi apakah tag c # benar-benar berlaku di sini? Bahasa lain memiliki tipe desimal juga.
Patrick M
1
@ Max: Sebagai latihan, saya sarankan Anda membayangkan mengubah nomor basis 2 ke basis 10 dengan tangan. Misalnya, untuk menghitung nilai 0.11_b2, tuliskan sebagai 0.5 + 0.5 * 0.5. Apakah ada langkah yang mungkin gagal atau menghasilkan desimal berulang? Secara pribadi, saya menemukan bahwa latihan ini melakukan pekerjaan yang baik untuk menemukan intuisi tentang angka-angka dasar 2. Saya kira seseorang bisa melangkah lebih jauh dan mengubah latihan ini menjadi bukti dengan konstruksi.
Brian
Ah, tapi kamu salah. 1/1010
Xavier J
3
@Ramhound Mengingat keterbatasan memori, biner dapat mewakili dengan 0.0999999....998..tepat, tetapi bukan angka penuh 0.1- perkiraan seperti pembulatan ke hundreth terdekat dengan 0.100adalah masalah implementasi yang melibatkan tidak menunjukkan semua digit dan membulatkannya.
Izkata
1
Yah, mungkin untuk menghasilkan mekanisme pengkodean FP yang memungkinkan '0,1' terwakili secara tepat. Pengkodean seperti itu hanya bergeser di sekitar set rentang angka FP daripada yang bisa dan tidak bisa direpresentasikan.
Martin James

Jawaban:

104

Inilah kunci untuk kesulitan Anda: 10adalah produk dari 2dan 5. Anda dapat mewakili angka apa pun persis di basis 10 desimal yaitu k * 1/2 n * 1/5 m di mana k, ndan mbilangan bulat.

Alternatif lain - jika angka ndalam 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 doublejenis yang tidak dapat diwakili decimal- mereka yang berada di luar jangkauan. Double.Epsilonadalah 4.94065645841247e-324yang 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.

Komunitas
sumber
+1 untuk penjelasan matematis yang jelas dan ringkas. Dan untuk menjawab versi yang lebih umum dari pertanyaan yang diajukan dalam judul, contoh angka yang tidak dapat diwakili dalam basis 10 adalah 1/3.
Doval
@Doval Saya curiga ada kesalahan dalam penalaran atau penjelasan saya bahwa orang yang lebih berorientasi matematika bisa menunjukkan ... tapi saya pikir saya berada di jalur yang benar jika itu masalahnya.
"Relatif prima" dalam hal ini hanya berarti "bukan faktor", kan? Apakah ada hubungan matematis yang lebih dalam yang saya lewatkan?
Patrick M
1
Ah, jadi seperti yang saya pahami, n = 15dan b = 10tidak relatif prima ("berbagi tidak ada faktor positif umum (pembagi) kecuali 1") karena mereka berbagi 5 sebagai faktor. Kuncinya adalah bahwa tidak semua faktor 15 (5 dan 3) juga bukan faktor 10. (Selain itu: apakah ada kata untuk menunjukkan angka yang memiliki atau tidak berbagi semua faktor umum?) Saya pikir itu rapi terbungkus dalam k, n, mpersamaan Anda , tetapi untuk benar-benar membungkus kepala saya di sekitarnya, saya perlu melihat plot 3d. Apapun, +1 layak untuk Anda.
Patrick M
1
@ PatrickM: "Selain itu: adakah kata untuk menunjukkan angka yang melakukan atau tidak berbagi semua faktor umum?": Setiap bilangan bulat adalah faktor itu sendiri, jadi jika semua faktor m adalah faktor n , maka itu sepele mengikuti bahwa m adalah faktor dari n . Satu istilah untuk ini, seperti yang Anda ketahui dengan jelas, adalah faktor . Lainnya adalah pembagi .
ruakh
6

Setelah Anda keluar dari rentang nilai yang dapat diterima, jawabannya adalah ya. Yang mengatakan, hampir semua yang ada dalam jangkauan akan memiliki representasi. C # Referensi desimal Meskipun tidak dinyatakan dalam spesifikasi, bilangan irasional tidak dapat direpresentasikan secara tepat (misalnya, e 1 , pi, akar kuadrat 2, dll.).

Kata kunci desimal menunjukkan tipe data 128-bit. Dibandingkan dengan tipe floating-point, tipe desimal memiliki presisi yang lebih besar dan rentang yang lebih kecil, yang membuatnya cocok untuk perhitungan keuangan dan moneter. Kisaran perkiraan dan presisi untuk tipe desimal ditunjukkan pada tabel berikut.

Presisi: 28-29 angka signifikan

1 Terima kasih kepada MichaelT karena telah mengingatkan saya pada nomor irasional lainnya.

Adam Zuckerman
sumber
2
@Magus mempertimbangkan nomor irasional e(2,71 ...). Log natural - ln (x) adalah log base e. Dengan demikian, basis irasional memang ada dan bermanfaat. Kegunaan khusus dari pi dasar, saya tidak yakin - tetapi itu tidak berarti tidak digunakan di suatu tempat.
6
@ Max Anda semakin banyak menyimpang ke pertanyaan matematika. Anda mungkin menemukan Jika nomor tidak rasional di basis 10, apakah itu tidak rasional di basis lain? menjadi bacaan yang bermanfaat dan titik awal untuk lebih banyak pertanyaan teori bilangan.
2
1/3 tidak irasional.
Adam Zuckerman
2
OP bertanya tentang basis 10 (sepuluh). Membuat basis sistem bilangan apa pun akan memungkinkan Anda untuk mengekspresikan apa pun sebagai 10. Berdasarkan artikel Wikipedia , menggunakan bilangan irasional sebagai basis tidak menjadikannya rasional. Bilangan rasional dapat dinyatakan sebagai bilangan bulat untuk pembilang dan penyebut, mengulangi angka dalam desimal, atau pemutusan angka hingga dalam desimal.
Adam Zuckerman
5
@FrustratedWithFormsDesigner Irrationality tidak ada hubungannya dengan pangkalan. Ya, itu melebih-lebihkan, tetapi irasionalitas yang berimplikasi pada representasi bilangan di berbagai basis (mis. Apakah ia memiliki angka non-berulang yang tak terbatas), bukan sebaliknya. Baca pertanyaan math.se yang ditautkan ke atas: math.stackexchange.com/questions/625473/…
1

Tipe floating-point basis-dua akan dapat secara tepat mewakili banyak nilai yang tidak bisa dimiliki oleh tipe-basis-sepuluh dengan ukuran yang sama . Nilai apa pun yang secara tepat dapat diwakili oleh tipe basis-2 dari beberapa ukuran akan persis mewakili dalam tipe basis-sepuluh dengan ukuran yang cukup. Ukuran yang diperlukan untuk tipe sepuluh basis-murni untuk mewakili semua nilai angka titik-mengambang biner akan tergantung pada kisaran eksponen dari tipe biner; ratusan bit untuk a float, atau ribuan untuk a double.

Yang telah dikatakan, Decimaltipe ini cukup besar sehingga memungkinkan untuk digunakan sebagai tipe "universal" yang mampu menahan nilai primitif numerik lainnya dan menyediakan beberapa fitur tambahan lainnya selain (jika tidak ada yang lain, gunakan satu bit untuk menunjukkan apakah nilai yang disimpan adalah hasil dari konversi a double, dan jika bit itu disetel, gunakan 64 bit untuk menyimpan nilai yang dipermasalahkan). Microsoft memilih untuk tidak melakukan itu. Akibatnya, konversi a doubleke Decimalgagal total untuk nilai besar, akan menyebabkan nilai kecil dibulatkan ke 1E-28 terdekat. Selanjutnya, bahkan dalam rentang dinamisdecimal, metode konversi tidak akan "pulang pergi". Misalnya, mengevaluasi 1.0 / 3.0 sebagai gandakan akan menghasilkan 0.3333333333333333148, tetapi mengonversinya menjadi desimal akan menghasilkan 0.333333333333333m dan mengonversi itu kembali menjadi gandakan akan menghasilkan 0.3333333333333329818.

supercat
sumber