Commodore sayı 71, sayfa 14

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 14

270 - (K-2.7,x -2) 90 — ,x1)

Aynı işlemi 10'un sıfır ve negatif üsleri için de tekrar edebiliriz: 15 = 7.5*10^1 3 = 3.0*10^0. Ondalıklı aritmetikte K'ya Mantis, X'e de Üs adı verilir. Son örnekte mantis 3, üs ise 0'dır. Sayıların bu şekilde gösterilmesine “normalize edilmiş gösterim” adı verilir. Bu gösterimde mantis her zaman bir ile kullanılan düzen arasında bir değer alır. Üs de, kullanılan düzenin üssü olarak mantisayla çarpılır. Normal sayılar için geçerli olan tüm kurallar normalize edilmiş sayılar için de geçerlidir. Mesela iki sayıyı çarpmak için mantisaları çarpar, üsleri toplarız. Eğer iki mantisanın çarpımı 10'dan büyükse (onluk düzende), bu değer ona bölünür ve üs bir artırılır. Yani sayı yeniden normalize edilir. Örneğin:

6Xx10:-2*7x10.1 — (6*7)x10.(-24-1)

yeniden normalize edersek:

4.2x10^-1 sonucunu elde ederiz. Normalize etme işlemi noktanın sağa veya sola kayması olarak düşünülebilir aslında. Eğer nokta sağa kayarsa üs azaltılır, sola kayarsa üs artırılır. Normalize edilmiş sayılarda toplama yapmak da mümkündür. Ama aritmetikten bildiğimiz kadarıyla, yalnızca üsleri aynı olan sayılar birbiriyle toplanabilir. Bu nedenle sayılardan üssü daha küçük olanı büyük olana eşitlememiz gerekir. Mesela:

— — 5.09 x 1000

Burada üsleri eşitlerken kullanmamız gereken iş, normalize ederken kullanacağımızın tam tersi. Yani üssü bir artıracaksak noktayı bir sola kaydırırız, bir azaltacaksak (ki buna toplamada ihtiyacımız olmaz) noktayı bir sağa kaydırırız. Tabii ki burada uğraştığımız sayılar hep onluk düzendeydi. Oysa bilgisayarlar genel olarak onluk düzende düşünemezler. Bu yüzden bütün bu işleri ikilik düzene taşımamız gerekecek. Başlangıçta tüm işlemleri ikilik düzende düşünmenin çok zor geldiğini biliyorum, ama makine dilinde ondalıklı sayı kullanmak için buna alışmamız gerekli. İkilik düzendeki bir sayı normalize edildiğinde 1 ile 2 arasında bir mantisaya sahip olur. Normalize edilmiş bir sayı şu şekilde görünür:

1.01110 x 2^10010 veya 1.011101 x 2^10

Bu sayının onluk düzendeki değeri ise şu şekilde hesaplanır:

— 262144 401217 > 0 14

*1*X16 — 65536 *1*215 — 32768

— 16384 0 - 4096 — 380928

Tabii ki sonucun tam sayı olma zorunluluğu yok. Mesela şuna bir bakın:

1.0117270 1X0 - 1 - 0 — 0.25 — 0.125 - 1.375

Nasıl ondalık düzende 1/3'ü tam olarak ifade edemiyorsak bu düzende de bazı sayıları ifade edemeyiz. Şu anda kafanızın çok karışmış olduğunun farkındayım ama olayı takip etmeye çalışın. Aklınızda her zaman bulunması gereken, yukarıdaki işlemlerin ancak ve ancak ikilik düzenden ondalık düzene geçişler yapılacağında tekrarlanacak olması. Yani tüm toplama, çarpma, bölme işlemleri ikilik düzende yapılır ve .25, .125 gibi garip sayılarla sık sık uğraşılmaz. İkilik çarpma, bölme, vb. sayılarla da bilgisayar uğraşacağı için (ROM'un kara kutularında) bize pek fazla iş düşmez. Bu sistemle 1'den küçük sayıları ifade etmeye çalıştığımızda, üssün negatif olarak da ifade edilmesi gerektiğini fark ediyoruz. Yani üssü göstermek için özel bir sistem bulmamız gerekli. Normalde negatif sayılar 2'nin tamlayanı olarak ifade edilir. Yani (sekiz bit için konuşursak), bayttaki tüm bitler

EOR #$FF komutuyla evrilir ve bu sayıya bir eklenir. Yani -1'i göstermek için: EOR #$FE + 1 = #$FF baytı kullanılır. Bu sayının son biti 1 olduğu için, sayının (-128, 127) aralığında bulunduğunu anlarız. Daha sonra da EOR ve ADC işlemlerini tekrar yaparak negatif sayının büyüklüğünü buluruz. Bu sayıların en büyük avantajı, toplama işleminde bize gerçek sonucu vermesidir. Örneğin: -3 + 6 işlemini yapmaya kalkarsak: $FD + $06 = $103 (eldeyi atarsak) = $03. Gördüğünüz gibi toplama işlemi kullanmamıza rağmen otomatik olarak çıkartma işlemini gerçekleştirmiş olduk. Ama bilinmeyen bazı sebeplerden dolayı, COMMODORE BASIC'de üs için kullanılan sistem bu değil. Onun yerine sayıya 129 eklemeyi tercih etmişler. Yani 128'le 0'ı, 127'yle -1'i, 131'le 3'ü, 132'yle 4'ü göstermişler. Demin söylediğim doğrudan toplama işlemi burada da aynen geçerli, ama makine dilinde kullanılan negatif sayılarla bir uyumsuzluk söz konusu. Tek baytla -128, 127 arası tüm sayılar gösterilebildiğine göre, üs için tek bayt ayırmakla 10^-39 ile 10^37 arasında bulunan sayılarla işlem yapılabilir. Bu da noktadan önce 37, noktadan sonra 39 basamaklı sayıları içerir. Tabii ki sayının tüm rakamları (digitleri) kullanılmaz. Kullanılacak rakam sayısı, mantisa için ayrılan bayt sayısıyla belirlenir. Biraz sonra bu konuya döneceğim. “Neden -128 ile 127 arası sayılar üs olarak kullanılmıyor? Normal olarak bir bayt bu aralıktaki sayıları gösteremez mi?” sorularının aklımıza geldiğinin farkındayım. Ama bu özel gösterimde bir değer de özel amaçlar için kullanılmıştır. Eğer üst baytı sıfıra eşitse, bu 2^-129 anlamına gelmez. Aksine, sayının (mantisa*2^üs) sıfır olduğunu gösterir. Bu sayede çarpma, bölme gibi işlemlerde özel durum olup olmadığını anlamak için doğrudan doğruya işaret baytının sıfır olup olmadığı kontrol edilebilir. Bu sayede hız biraz daha artar. Sayının Kesinliği: Demin de değindiğim gibi bir sayının kesinliğini mantisayı göstermek için ayırdığımız bayt sayısı belirler. Kesinlikten kastımız, ardışık iki sayıda, bir öncekinin bir fazlası olarak belirtilebilecek basamağın numarasıdır. Yani 0.0000025'den bir sonraki sayıyı 0.0000034 olarak gösterebiliyorsak, sistemimiz noktadan sonra yaklaşık 6 basamaklı bir kesinliğe sahiptir. Her ne kadar noktadan sonra yedinci basamak da gösteriliyorsa da, 0.0000026'yı gösteremediğimiz için “kesinlik yedidir” diyemeyiz. Eğer kendi sistemimizi kuracaksak ilk olarak ne kadar basamağa ihtiyacımız olduğunu belirlemeliyiz. Unutmayın, fazla kesinlik bilgisayarınızı yavaşlatır. 15

Klavyeyle gezinmek için ← ve → tuşları.