Bu sayfadaki yazılar
Sayfanın metni
Sayfa 10
sayıda makine dilinin daha kolay kullanma yollarını araştırıyorduk hatırlarsanız.
Ama daha işin başından zorlu bir kayaya çarptık. Makine dilini kullanarak ondalıklı sayılarla işlemleri nasıl yapacağımız sorununu araştırmak istiyorduk. Ama bu işe girişmeden önce sahip olmanızı istediğim temel birazcık uzun sürecek gibi. En iyisi lafı fazla dolandırmadan temeli inşa etmeye devam edelim, yoksa bu sayı da harcanacak gibi... Hatırlarsanız geçen sayıda ikilik düzende ondalık kesirli sayıları nasıl ifade edebileceğinizi anlatmıştım. Son olarak da birkaç örnek çözmüştük. Bu sayıda da kaldığımız yerden devam edeceğiz. İlk olarak düzendeki kesirli sayıların ondalık düzendeki karşılığını bulmayı öğreneceğiz, daha sonra bu sayıların bilgisayarda kullanılmasıyla ilgili birkaç örnekle uğraşacağız. Kolay gelsin! Geçen sayıdaki bilgilerimizle sayıları ondalık düzenlerden ikilik düzene çevirebiliyorduk. Şimdi de tersini yapmaya çalışalım. Hatta anlamak için örnek üzerinde çalışalım. Örneğimiz geçen sayıda çözdüğümüz -5.5 olsun:
M3 M4
83 BO 00 0000 sonücünü geçen sayıda bulmuştuk. Geri dönmek için uzun uzun uğraşmak yerine basit bir formül oluşturalım isterseniz: SAYI — (ML AND 128)*2.(ÜS-129)* AND ( işareti üs alma işlemini gösteriyor.) Yukarıdaki formüle dikkatle baktığınızda işaretin doğrudan doğruya Mantisa'nın ilk baytının (M1) son bitinden okunduğunu
Vedat Hallaç
0. -0.0078125 -0.0009765625
-0.00048828125
-0.00009765625 - -0.00006103515625
0.00003662109275
İkinin üssü: -2
-6 görebilirsiniz. Üssü hesaplamak için üs baytının 129 eksiğini almamıza da dikkatinizi çekerim. Bir de, her bitin etkisini ayrı ayrı hesaplamak yerine baytların değerini olduğu gibi 256'ya (ve katlarına) bölerek bit ağırlığı hesaplaması yapılıyor. İsterseniz formülümüzü yukarıdaki sayı üzerinde deneyelim: X = -SGN(176 AND 128) * ... Bu işlem sonucunda orijinal -5.5 sayısını elde ederiz. İsterseniz bu konuyu pekiştirmek açısından siz de bazı sayıları ondalık düzenden ikilik düzene çevirin, sonra da aynı işlemi tersine yapın. Bilirsiniz, pratik olmadığı zaman bu teorik bilgiler uçup gider... Hayat o kadar da kolay değil... Şimdiye kadar çözdüğümüz tüm örneklerde ikilik düzendeki sonuçlar tam olarak bitlerine sığdılar. Oysa gerçek hayatta her şey bu kadar basit değildir. İsterseniz bir de 0.4'ü ikilik düzene çevirmeye çalışalım. Geçen sayıda yaptığımız gibi her seferinde ikinin en yüksek üssünü sayımızdan çıkararak ilerleyeceğiz: Bu işlemleri sonsuza kadar sürdürebiliriz.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 11
nun
Bölmelerin sonucu hiçbir zaman sıfıra erişmeyecektir. Sonuç olarak kendini tekrar eden bir sayıyla karşılaşırız:
1001 1001 1001 1001 1001 1001 1001 Bu da demektir ki 0.4 sayısı ikilik düzende hiçbir zaman tam olarak ifade edilemez. Elimizde 32 bit olduğu için ilerlemeyi 31. bitte durdurmamız gerekir. Yani sonuç olarak:
1.1001 1001 1001 1001 1001 1001 1001 1001 değerini alacaktır. Üs ve işaret bitiyle birlikte: 0100 1100 1100 1100 1100 1100 1100 1100 veya onaltılık olarak: 3F4CCCCCCD değerini alacaktır. 0.4'ü bu düzeyde yazamamış olmamız kesinlikle sadece ikilik düzeyden doğan bir problem değildir. Aynı problem her düzeyde bulunur. İsterseniz 1/3'ü ondalık düzende yazmaya çalışın. Sonuçta şöyle bir
Ve bu sayıyı da bir yerlerde kesmek zorunda kalırsınız. Oysa onluk düzende bu sayı 0.333... olarak ifade edilir.
Yaşasın, pratiğe geldi sıra: Satırlar dolusu karmakarışık teorik bilgiler sonucunda öğrendiğimiz bu ikilik-onluk, onluk-ikilik dönüşümleri ve kesirli sayılarla yapılan işlemler bilgisayar tarafından sık sık kullanılmaktadır. Bu yüzden BASIC-ROM'da yerlerini almış durumda beklerler. Bu durumda yapılacak en iyi şey bu rutinleri kullanmayı öğrenmek olacaktır sanırım. BASIC yorumcusu işlemleri için iki adet kesirli sayı belleğine sahiptir. FAC (Floating Point Accumulator) adını alan bu belleklere sırasıyla FAC1 ve FAC2 isimleri verilir. Her iki akümülatör de 6'şar bayttan oluşur (1 bayt üs için, 4 bayt mantisa için, 1 bayt da işaret için). Bu baytların yanında, bazı işlemler için kullanılabilecek ekstra iki bayt daha vardır. Tek girdili işlemler yapılacaksa (SIN, COS, LOG, vb. gibi) mutlaka FAC1 kullanılır. Eğer toplama, çarpma gibi işlemler yapılacaksa ikinci
sayıyla karşılaşacaksınız: değer FAC2'de kullanılır. İşlemin sonucu
ise her zaman FAC1'de tutulur. Bu sebeple 0.333333333333 genelde FAC1, FAC2 ise ARG (argüman) olarak kullanılır. Bu sayede önceliği daha iyi vurgulanır. Bu akümülatörlerdeki sayılar sıkıştırılmış 5-bayt formatında tutulmazlar. İşaret bitini tutmak için bir bayt ayrılmıştır. Demin söylediğim ekstra baytlardan biri yuvarlama işlemleri için kullanılan genel bir bayttır (yuvarlama baytı). Diğeri ise iki girdili işlemlerde, işaretlerin karşılaştırılmalarının sonucunu tutar. Eğer iki girdinin de işareti aynıysa $00, farklıysa $FF değerini alır ve işaret karşılaştırma baytı olarak adlandırılır. Bu baytların adreslerini aşağıdaki tabloda bulabilirsiniz,
Tablo 1: ROM tarafından kullanılan adresler.
ERSEY
Fok