Çoğu programlama dilinde, kayan nokta sayıları bilimsel gösterime çok benzer şekilde temsil edilir : üs ve mantis (anlamlı olarak da adlandırılır). Çok basit bir sayı, diyelim ki 9.2
, aslında bu kesir:
5179139571476070 * 2 -49
Üslü -49
ve mantis nerede 5179139571476070
. Bazı ondalık sayıları bu şekilde göstermenin imkansız olmasının nedeni , üs ve mantisin tamsayı olması gerektiğidir. Diğer bir deyişle, tüm kayan noktalar 2 tamsayısı ile çarpılan bir tam sayı olmalıdır .
9.2
sadece olabilir 92/10
, ama 10 olarak ifade edilemez 2 n ise n tam sayı değerleri ile sınırlıdır.
Verileri Görme
İlk olarak, birkaç işlevi 32 ve 64 bit yapan bileşenleri görmek için float
. Yalnızca çıktıyı önemsiyorsanız bunlar üzerinde parlaklık (Python'da örnek):
def float_to_bin_parts(number, bits=64):
if bits == 32: # single precision
int_pack = 'I'
float_pack = 'f'
exponent_bits = 8
mantissa_bits = 23
exponent_bias = 127
elif bits == 64: # double precision. all python floats are this
int_pack = 'Q'
float_pack = 'd'
exponent_bits = 11
mantissa_bits = 52
exponent_bias = 1023
else:
raise ValueError, 'bits argument must be 32 or 64'
bin_iter = iter(bin(struct.unpack(int_pack, struct.pack(float_pack, number))[0])[2:].rjust(bits, '0'))
return [''.join(islice(bin_iter, x)) for x in (1, exponent_bits, mantissa_bits)]
Bu işlevin arkasında çok fazla karmaşıklık var ve açıklamak oldukça teğet olurdu, ancak ilgileniyorsanız, amaçlarımız için önemli kaynak yapı modülüdür.
Python's float
64-bit, çift kesinlikli bir sayıdır. C, C ++, Java ve C # gibi diğer dillerde, çift duyarlıklı double
genellikle 64 bit olarak uygulanan ayrı bir tür vardır .
Örneğimizle bu işlevi çağırdığımızda, şunu 9.2
elde ederiz:
>>> float_to_bin_parts(9.2)
['0', '10000000010', '0010011001100110011001100110011001100110011001100110']
Verileri Yorumlama
Dönüş değerini üç bileşene böldüğümü göreceksiniz. Bu bileşenler:
- İşaret
- üs
- Mantissa (Anlamlı veya Kesir olarak da adlandırılır)
İşaret
İşaret, ilk bileşende tek bir bit olarak saklanır. Açıklamak kolaydır: 0
şamandıranın pozitif bir sayı olduğu anlamına gelir; 1
negatif olduğu anlamına gelir. Çünkü 9.2
olumlu, bizim işareti değeridir 0
.
üs
Üs, orta bileşende 11 bit olarak depolanır. Bizim durumumuzda 0b10000000010
,. Ondalık olarak, bu değeri temsil eder 1026
. Bu bileşenin tuhaflığı , gerçek üssü elde etmek için 2 (bit sayısı) - 1 - 1'e eşit bir sayı çıkarmanız gerektiğidir ; bizim durumumuzda bu , gerçek üssü elde etmek için 0b1111111111
(ondalık sayı 1023
) çıkarma (ondalık sayı 3 ) anlamına gelir 0b00000000011
.
mantis
Mantis üçüncü bileşende 52 bit olarak depolanır. Ancak, bu bileşene de bir tuhaflık var. Bu tuhaflığı anlamak için bilimsel gösterimdeki bir sayıyı şöyle düşünün:
6.0221413x10 23
Mantis olurdu 6.0221413
. Bilimsel gösterimdeki mantisin her zaman sıfır olmayan bir rakamla başladığını hatırlayın. Aynısı ikili dosya için de geçerlidir, ancak ikili dosyada yalnızca iki basamak vardır: 0
ve 1
. Böylece ikili mantis her zaman ile başlar 1
! Bir şamandıra depolandığında, 1
ikili mantis önündeki yerden tasarruf etmek için atlanır; gerçek mantis elde etmek için onu üçüncü elementimizin önüne yerleştirmeliyiz :
1,0010011001100110011001100110011001100110011001100110
Bu, basit bir eklemeden daha fazlasını içerir, çünkü üçüncü bileşenimizde depolanan bitler aslında mantisin, yarıçap noktasının sağındaki kesirli kısmını temsil eder .
Ondalık sayılarla uğraşırken, 10'luk güçlerle çarparak veya bölerek "ondalık noktasını hareket ettiririz". İkili olarak, 2'nin güçleriyle çarparak veya bölerek de aynı şeyi yapabiliriz. Üçüncü elemanımız 52 bit olduğu için böleriz tarafından o 2 52 o sağa 52 yerlere taşımak için:
0,0010011001100110011001100110011001100110011001100110
Ondalık gösterimde, o bölünmesi aynı şey 675539944105574
tarafından 4503599627370496
olsun 0.1499999999999999
. (Bu, tam olarak ikili, ancak yaklaşık olarak ondalık olarak ifade edilebilen bir oranın bir örneğidir; daha fazla ayrıntı için bkz: 675539944105574/4503599627370496 .)
Şimdi üçüncü bileşeni kesirli bir sayıya dönüştürdüğümüze göre 1
, gerçek mantis verir.
Bileşenleri Yeniden Kapatma
- İşaret (birinci bileşen):
0
pozitif 1
için, negatif için
- Üs (orta bileşen): Gerçek üssü elde etmek için 2 (bit sayısı) - 1 - 1'i çıkarın
- Mantissa (son bileşen): 2'ye bölün ( bit sayısı) ve
1
gerçek mantis elde etmek için ekleyin
Sayının Hesaplanması
Her üç parçayı bir araya getirdiğimizde, bu ikili sayı bize verilir:
1.0010011001100110011001100110011001100110011001100110 x 10 11
Daha sonra ikiliden ondalığa dönüştürebiliriz:
1.1499999999999999 x 2 3 (hatalı!)
Ve 9.2
kayan nokta değeri olarak saklandıktan sonra ( ) ile başladığımız sayının son temsilini ortaya çıkarmak için çarpın :
9,1999999999999993
Kesir olarak temsil etme
9.2
Şimdi sayıyı inşa ettiğimize göre, basit bir kesite yeniden yapılandırmak mümkün:
1.0010011001100110011001100110011001100110011001100110 x 10 11
Mantisayı bir tam sayıya kaydır:
10010011001100110011001100110011001100110011001100110 x 10 11-110100
Ondalık biçime dönüştür:
5179139571476070 x 2 3-52
Üs çıkarın:
5179139571476070 x 2 -49
Negatif üssü bölünmeye dönüştürün:
5179139571476070/2 49
Üs değerini çarp:
5179139571476070/562949953421312
Hangisi:
9,1999999999999993
9.5
>>> float_to_bin_parts(9.5)
['0', '10000000010', '0011000000000000000000000000000000000000000000000000']
Zaten mantis sadece 4 basamak ve bir sürü sıfır olduğunu görebilirsiniz. Ama adım adım ilerleyelim.
İkili bilimsel gösterimi birleştirin:
1.0011 x 10 11
Ondalık noktasını kaydır:
10011 x 10 11-100
Üs çıkarın:
10011 x 10 -1
İkiliden ondalığa:
19 x 2 -1
Bölümleme için negatif üs:
19/2 1
Üs değerini çarp:
19/2
Eşittir:
9.5
daha fazla okuma