Bu sayfadaki yazılar
Sayfanın metni
Sayfa 56
0.1101— 1*(1/2) * 0*(1/8) * 1*(1/16) 0.5 4 0.25 4 0 4 0.0625 0.8125 ondalık
1*(1/4) +
İkilik bir kesrin ondalık karşılığını bulmanın başka bir yolu daha var. Örneğin 0.058 ondalık kesrini “binde 58” olarak okuduğumuz gibi 0.1101 ikilik kesrini “onaltıda 13” şeklinde okuyabiliriz, çünkü 1101 13'e eşittir ve 0.1101'in en sağındaki basamak onaltıda birler basamağıdır. Eğer 13/16'yı bölerek ondalık sayıya çevirirsek önceki sonuç olan 0.8125'i elde ederiz. Bilgisayar yalnızca ikilik yapıda değil, aynı zamanda bayt yapılıdır. Bir bayt 8 ikilik basamaktan oluşan bir gruptur. İkilik kesirler bilgisayarda en kolay biçimde bayt düzeninde saklanırlar. Örnek olarak 0.1101001 ikilik kesrini düşünelim. Yine bunu bit'lerine göre ondalığa çevirebiliriz.
— 1*(1/2) 4 1*4(1/4) * 1*(1/16) * 8*(1/32) * 0*(1/64) * 0*(1/128) 4 1*(1/256) - 0.81640625
Diğer metodu kullanacak olursak önce ondalık karşılığı 209 olan tamsayı ikilik kısmı (11010001) alıp bunu 256'ya böleriz (çünkü baştaki ikili kesrin en sağındaki bit 256'da birler basamağındadır). 209/256 işleminin sonucu yine yukarıdaki gibi
0.81640625 olacaktır.
0.11010001, — 11010001,/256 — 209/ 256-0.81640625
209 sayısı, bayt'ın en solundaki bit'in değeri 128 olduğundan 11010001'in 1*128 + 1*64 + 0*32 + 1*16 + 0*8 + 0*4 + 0*2 + 1*1 = 209 biçiminde yazılışından ileri gelmektedir. Bütün bu yolların BASIC'teki floating-point saklama şekliyle nasıl ilgili olduklarını görmeden önce başka bir örneğe daha ihtiyacımız var. Ondalık bir kesri normalize etmenin ondalık noktayı mantis'in en önemli basamağının soluna kaydırmak demek olduğunu gördük. Bu hareketi üssün değerini değiştirerek denkleştiriyorduk. İkilik kesirleri normalize etmek için de aynı mantıkla çalışan benzer bir işlem yapılıyor. 209 ondalık sayısını düşünelim. Bu sayıyı normalize ikilik floating-point değerinde şöyle ifade edebiliriz: 1) 209'u 2'nin kuvvetinin bir katı olarak yazalım:
ik katı olduğundan) — 11010001.E0 (burada E, “*2A ” yerinde kullanılmıştır).
2) Radix noktasını en soldaki sıfır olmayan bit'e (8 basamak sola) kaydıralım:
0.11010001
3) Bu kaydırma işlemini, üssü 8 arttırarak denkleştirelim:
0.11010001E8
İşlemin sağlamasını yapmak için 0.11010001 ikilik kesrini alarak 2^8 ile çarpalım. Daha önceden 0.11010001'in 0.81640625'e eşit olduğunu gördük ve 2^8'in 256 olduğunu biliyoruz. Öyleyse 0.81640625 * 256 = 209'dur. Alternatif olarak
0.11010001, 209/256'dır ve 209/256 * Bu yazımda da bir şey kaybetmiyoruz.
DERİNLİKLERE DOĞRU
Eğer buraya kadar olan kısmı özellikle ikilik kesirler ve normalizasyon bölümlerini iyice anladıysanız, floating-point sayıların bilgisayar içinde nasıl saklandığına yakından bakabiliriz. Burada Floating-Point Çeviricisi programından bahsedeceğiz. Bu program, herhangi bir sayının bilgisayarın içinde nasıl temsil edildiğini görebilmemiz için, floating-point değişkeninde bulunan bilgiyi ekranda göstermektedir. Program ayrıca belleğe direkt olarak data değerleri girmenize ve bilgisayarın bunları nasıl bir floating-point niceliği olarak yorumladığını görmenize olanak sağlamaktadır. Program, en başta ilk tanımlanan değişkenin saklandığı bellek adresine bakıyor. Bu bellek adresi “değişkenler pointer'ının başlangıcı” yoluyla bulunuyor. Bu pointer C-128'de 47 ve 48 adreslerinde, C64'te ise 45 ve 46 adreslerinde saklanan iki baytlık bir sayıdır (gelecek ayki C64'ün BELLEK HARİTASI yazı dizisinde bu adresler hakkında detaylı bilgi bulabilirsiniz). Satır 70, hangi bilgisayarın kullanıldığını belirtiyor. Satır 80 ise pointer'ın başlangıç adresi için uygun bir değer seçiyor. Satır 90, aşağıdaki standart formülü kullanarak 2 baytlık pointer'ı bir bellek adresine dönüştürüyor:
Adres = (pointer'ın ilk baytı) + 256 * (pointer'ın ikinci baytı)
Bu adres programın ilk değişkeninin yerleştiği yerdir. Her değişken için 7 bayt bellek ayrılır. Floating-point değişkenlerinin saklanma düzeni aşağıdaki gibidir:
Byte Kapsam Byte — Kapsam 1 İsimli 5 Mant2 2 İsim2 6 — Mant3 7 Mant4 4
Her değişkenin iki karakterden oluşan bir ismi olabilir (esasında sadece ilk iki karakter dikkate alınır). Bu karakterler İsim1 ve İsim2'de saklanırlar. Eğer değişkenin tek karakterlik bir ismi varsa bu karakter İsim1'de saklanır ve İsim2 0 değerini alır. Kalan 5 bayt üs ve değişkenin floating-point değerinin mantisidir. Her bayt 0-255 arası bir değer alabilir. Üs “128-fazlası” bir değer olarak saklanır, ki bu da basit anlamda gerçek değere 128 eklenmesi demektir. Burada gösterilebilecek en küçük üs 0 olarak saklanan -128'dir. Mümkün olan en büyük üs ise 255 olarak saklanan 127'dir. Bu üslerin aslında 2'nin kuvvetleri olduğunu hatırlayın. Normalize mantis dört baytta saklanır. Ancak burada bir karmaşık nokta daha var. Mantis önceden normalize edildiğinden (radix noktası en soldaki 0 olmayan bit'in soluna getirildiğinden) en soldaki bit'in daima 1 olduğunu gördük. İşte burada çok akıllıca bir mantık devreye giriyor. Çok dikkatli okuyun. Üssün, mantis'in en soldaki bit'i daima 1 olacak şekilde düzenlendiğini biliyoruz ve bu yüzden burada yani en soldaki bit'te 1 değerini saklamamız gerekmiyor. Esasında, bu bit mantis'in negatif mi yoksa pozitif mi olduğunu göstermek için kullanılıyor. Eğer mantis negatif ise en sol bit'te 1 saklanıyor. Eğer pozitif ise burada saklanan değer 0 oluyor. Ancak en soldaki bit'te ne saklandığına bakmaksızın bu bit'in değerinin daima 1 olduğunu biliyoruz (en azından bilgisayar biliyor). Bu bit'te ayrıca ne saklandığına bakarak mantis'in işaretini öğreniyoruz. Çok akıllıca, değil mi? Şimdi programımıza geri dönelim ve bilginin nasıl okunup gösterildiğini görelim. X0 değişkeni için üs ve 4 mantis baytı S1-S5 adreslerinde yer alıyorlar. Satır 260 bu adreslerin sakladıkları değerleri bulmak için PEEK komutunu kullanıyor. Bu 5 bayt V1-V5 değişkenlerinde saklanıyor. Satır 1010'daki rutin bu 5 baytı yazıyor ve yorumluyor. Üs, satır 1030'da “128-fazlasını” çıkartarak hesaplanıyor. Mantis ise satır 1040'ta diğer 4 bayttan bulunuyor. V2 mantis'in en soldaki baytını saklıyor. En soldaki baytının daima 1 olması gerektiğini hatırlayın. 128 OR V2 ifadesi gerçek değerine bakmaksızın bit'i 1 yapıyor. İlk mantis baytının 256'da birlerin sayısı olarak düşünülebileceğini görmüştük. İkinci mantis baytı (1/256) pozisyonundadır. Benzer şekilde üçüncü ve dördüncü mantis baytları (1/256)^2 ve (1/256)^3'ü temsil ederler. Satır 1040 mantis'in değerini hesaplamanın etkili bir örneğini göstermektedir. Çömez bayt (en sağda
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 57
4
ALAK EMRE KİNG 161 65 AK ORK AK ORK ÖR OK AR OK OR OK AK OR RK OR OK OK KAR AK OR KR ORK AR OR KR KK OR AK OK OR KOK O OK OK OR KOK KK olan) V5 önce 256'ya bölünür. Sonraki bayt olan V4 buna eklenir ve sayı tekrar 256'ya bölünür. Şimdi V5'i 2562'ne bölmüş olduk. Bundan sonra çıkan sayı V3 ile toplanır ve tekrar 256'ya bölünür. Son olarak düzeltilmiş en önemli mantis bayt'ına V2 eklenir ve çıkan 256'ya bölünür. Şimdi kendinizi satır 1040'taki MN değişkenin aşağıdaki değeri sakladığına inandırmanız için biraz cebir alıştırması yapmaya gerek duyabilirsiniz. V2/256 4 V3/2562 4 V4/2563 * V5/2564