Bu sayfadaki yazılar
Sayfanın metni
Sayfa 15
Commodore'unuzda mantisayı belirtmek için dört bayt kullanılır. Bu 32 ikilik basamak gösterilebildiği anlamına gelir. Peki ondalık sayılarda ne gibi bir kesinliğe sahiptir 32 bit? Bunu anlayabilmek için sadece son biti farklı olan iki sayıyı birbirinden çıkarmalıyız. İsterseniz bu işi en büyük mantisayla onun bir küçüğü için yapalım (aradaki boşluklar sadece bit sayısını daha kolay görebilmeniz için kullanılmıştır).
1111 1111 1111 1111 DIL 1111 1110
“74 0.000 0000 0000 0000 0000 0000 0000 0001
Son sayıyı ondalık düzene çevirirsek:
“71 0.000 0000 0000 0000 0000 0000 0000 0001 - 0.000000000465661287 yaklaşık olarak noktadan sonra 10. basamakta bulunan 5 basamak kesinliğini belirler. Buradan yola çıkarak sayımızın kesinliğinin noktadan sonra yaklaşık dokuz basamak olduğunu söyleyebiliriz. Bu sayısal kesinlik hiçbir şekilde üs için ayrılan bayt sayısına bağlı değildir. Üs için fazla bayt ayırırsanız işlem 10.-4000'lere kadar uzanabilir ama sayının kesinliği gene de noktadan sonra dokuz basamakta sınırlı kalacaktır. Eğer bir sayı noktadan sonra onuncu basamağa ve daha fazlasına iniyorsa, fazla basamaklar dokuz basamağa yuvarlanacaktır. Bu yuvarlamayı israf olarak görebilirsiniz, ama bilgisayarın gösterebildiği her sayıyı rahatça kullanabilmeniz için bu yuvarlanmanın yapılması şarttır.
Klavyeyle gezinmek için ← ve → tuşları.
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