İşte ikilem anahtarıdır: 10
ürünüdür 2
ve 5
. Sen k * 1/2 olduğunu tam olarak tabanın 10 ondalık sayılar herhangi sayısını temsil edebilir n * 1/5 m nerede k
, n
ve m
tam sayılardır.
Alternatif olarak ifade edilir - n
1 / n'deki sayı bazın faktörlerinin bir parçası olmayan bir faktör içeriyorsa, sayı tam olarak ikili / ondalık / o sayıdaki genişlemedeki sabit sayıdaki hanelerde gösterilemez. sayı - yinelenen bir kısmı olacak. Örneğin 1/15 = 0.0666666666 .... çünkü 3 (15 = 3 x 5) 10 faktörü değildir.
Böylece, tam olarak baz 2'de (k * 1/2 n ) temsil edilebilen herhangi bir şey tam olarak 10 bazında temsil edilebilir.
Bunun ötesinde, sayıyı göstermek için kaç basamak / bit kullandığınızın bir sorunu var. Bazı bazlarda tam olarak temsil edilebilecek bazı sayılar vardır, ancak yapılması gereken bazı basamak / bitlerden daha fazlasını gerektirir.
İkili dosyada, ondalık sayıda uygun şekilde 0,1 olan 1/10 sayısı, ikili olarak sabit sayıda bit ile temsil edilebilecek bir sayı olarak gösterilemez. Bunun yerine, sayı 0.00011001100110011 ... 2'dir (0011 kısmı sonsuza dek tekrarlanır).
1 numara bakmak Lets 2 /1010 2 biraz daha yakından.
____
0,00011
+ ---------
1010 | 1,00000
0
-
1 0
0
----
1 00 --------- +
0 |
----- |
1 000 |
0 |
------ | tekrarlanan
10000 | blok
1010 |
------ |
1100 |
1010 |
---- |
100 ---- +
Bu, 1/3 için uzun bölümü yapmaya çalıştığınızda elde ettiğinizle aynı şeydir.
Faktör 1 / (2 1 * 5 1 ) olduğunda 1/10 . Baz 10 için (veya 10'dan herhangi biri), bu sayı sona erer ve normal bir sayı olarak bilinir . Tekrarlayan bir ondalık genişleme, tekrarlayan bir ondalık olarak bilinir ve yinelenmeden sonsuza kadar devam eden sayılar irrasyonel sayılardır.
Bunun arkasındaki matematik Fermat'ın küçük teoremine giriyor ... ve Fermat veya teorem demeye başladığınızda, bir Math.SE sorusu haline geliyor .
Taban 10'da gösterilemeyen ancak taban 2'de gösterilebilen numaralar var mı?
Cevap hayır'.
Bu nedenle, bu noktada rasyonel bir sayının her bir sabit uzunluklu ikili genişlemesinin sabit bir uzunluk ondalık genişlemesi olarak gösterilebileceği net olmalı.
Lets C # ondalık daha yakından göz götürür .NET içinde ondalık kayan nokta ve yazar verilen, nasıl çalıştığını o Thats kabul edeceğiz.
Ondalık tür diğer kayan nokta sayılarıyla aynı bileşenlere sahiptir: bir mantis, bir üs ve bir işaret. Her zamanki gibi, işaret sadece bir bit, ama 96 bit mantis ve 5 bit üs. Ancak, tüm üs kombinasyonları geçerli değildir. Yalnızca 0-28 arasındaki değerler çalışır ve hepsi etkin olarak negatiftir: sayısal değer . Bu, türün maksimum ve minimum değerlerinin +/- (2 96 -1) olduğu ve mutlak büyüklük bakımından sıfır olmayan en küçük sayının 10 -28 olduğu anlamına gelir .sign * mantissa / 10exponent
Derhal şunu belirteyim ki, bu uygulama nedeniyle, double
temsil edilemeyecek türde sayılar olduğunu decimal
- aralık dışında olanlar. Double.Epsilon
bir 4.94065645841247e-324
içinde temsil edilemez decimal
, ancak bir olabilir double
.
Bununla birlikte, ondalık basamağın temsil edebileceği aralık dahilinde, diğer yerel türlerden daha fazla hassasiyet biti vardır ve bunları hatasız olarak temsil edebilir.
Etrafta yüzen başka türler de var. C # 'da keyfi olarak büyük bir tamsayıyı temsil edebilen bir BigInteger var . Java'nın için hiçbir eşdeğer yoktur BigDecimal (2 up ondalık basamağı olan sayılar yukarı temsil edebilir 32 - olan oldukça büyük bir aralık uzun basamak) tam . Bununla birlikte, biraz dürtme yaparsanız, elle döndürülmüş uygulamaları bulabilirsiniz.
Ayrıca, rasyonelleri tam olarak temsil etmenizi sağlayan rasyonel bir veri tipine sahip bazı diller vardır (1/3 gerçekte 1/3).
Özellikle C # ve float veya rasyonel seçimi için, .NET'teki Ondalık kayan pint'den Jon Skeet'e erteleyeceğim :
Çoğu iş uygulaması muhtemelen yüzer veya çift değil de ondalık kullanıyor olmalıdır. Temel kural, para birimi gibi insan yapımı değerlerin genellikle ondalık kayan nokta ile daha iyi temsil edilmesidir: tam olarak 1,25 dolar kavramı, örneğin tamamen makul. Uzunluk ve ağırlıklar gibi doğal dünyadaki değerler için, ikili kayan nokta tipleri daha anlamlı olur. Teorik olarak "tam olarak 1.25 metre" olmasına rağmen, gerçekte asla gerçekleşmeyecek: kesinlikle kesin uzunlukları asla ölçemeyeceksiniz ve atomik seviyede bile var olma ihtimalleri çok düşük. Orada belirli bir tolerans varlığına alışkınız.