Commodore sayı 36, sayfa 55

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 55

Bilgisayarınızın hesaplayabileceği en büyük değer, alışılmadık bir sayı olan 1.70141183E+38'dir. 0'a yakın en küçük sayı ise 2.03873588E-39'dur. Acaba bilgisayarları dizayn edenler bu tuhaf değerleri nereden buldular?.. Tamsayıların bilgisayarlarda ikilik sistemde saklandığını pek çok kimse biliyor, ancak acaba bilgisayar, ondalık kesirleri ve bilimsel notasyonla yazılan sayıları nasıl düşünüyor? Neden bilgisayar sonuç olarak ekranda “6” değerini göstermesine rağmen 36'nın karekökünün 6'ya eşit olmadığını söylüyor. Bu soruları ve diğer pek çoğunu yanıtlamak için floating-point sayıların karmaşık ve şaşırtıcı dünyasında bir araştırma yapacağız. Araştırmanın sonunda BASIC dilinin en önemli ve karışık bölümlerinden birinin iyi bir değerlendirmesini yapabileceksiniz. Bilgisayarın bize sonuç olarak verdiği sayılarda göründüğünden daha başka şeyler olduğunu daha iyi anlamak için direk moddan şu satırı girin:

A-6:B- SOR(36): PRINT A,B: IF A< >B THEN PRİNT “A VE B EŞİT DEĞİL”

Bilgisayar A ve B değeri olarak “6” sayısını verecektir, fakat bu arada A ve B'nin eşit olmadıkları sonucuna varacaktır. Eğer A ve B'nin bellekte saklanış şekline bakacak olursak aşağıdakini görürüz:

A: 13164000 B: 13164001

Belli ki A ve B, bilgisayarın içinde farklı sayılar. Ancak bu, “6” gibi basit bir sayının “131 64 0 0 0” olarak beş bayt halinde saklandığı tuhaf düzeni nasıl açıklarız?

TUHAF DÜZEN

BASIC'te nümerik değişkenlere verilen bütün sayı değerleri “ikisi en önemli bit'i tamamlayan ve biri 128 fazlası üssü temsil eden 4 bayt'lık normalize mantis (bir logaritmanın ondalık kısmı)” olarak tanımlanabilen bir floating-point düzeninde saklanırlar. Bu karmaşık terminoloji topluluğu sizi ürküttüyse floating-point sayıların saklanış şeklinin basitleştirilmiş bir örneği kaygılanacak bir şey olmadığını gösterecektir. Standart bilimsel notasyonda yazılmış bir sayıyla başlayalım: 4 x 10^3

Bu nicelik BASIC'te 4E3, 0.4E4, 40E2 veya hepsi 4000 sayısına eşit başka değişik şekillerde ifade edilebilir. Burada “E” harfi “on sayısının kuvvetlerinin sayısı” anlamında kullanılmaktadır. “E”'yi açıklamanın bir yolu da ondalık noktanın, basamaklara göre kaydığını düşünmektir. Örneğin 0.4E4'ün değerini bulmak için 0.4'ü 0.40000 şeklinde yazın (istediğiniz kadar 0 koyabilirsiniz), sonra da ondalık noktayı dört basamak sağa kaydırarak 4000.0'i bulun. “E”nin arkasına gelen sayıya “üs”, önüne gelen sayıya ise “mantis” denir. Burada 10, esas alınan başlama sayısıdır ve “taban” olarak adlandırılır. Bütün gerçek sayılar üslü bir tabanın, mantis katı şeklinde ifade edilebilirler. Bir mantis'i 0.1'den büyük veya eşit ve 1.0'dan küçük bir ondalık kesire çevirerek veya “normalize ederek” onu daha kullanışlı bir duruma getirebilirsiniz. Bundan sonra üs ile denklik sağlanabilir. Örneğin, 4000'in normalize şekli 0.4E4'tür, çünkü mantis 0.1 ile 1 arasındadır. 40E2, 400E1 ve 4000E0 gibi diğer şekillerin hepsinin değeri aynıdır, fakat normalize değildirler. Birkaç çeşitli değerler ve normalize floating-point karşılıkları:

123 — 0.123E3 54.321 — 0.54321E2 0.5 — 0.5E0 6 — 0.6E1 0.05 — 0.5E-1 0.00064 — 0.64E-3

Dikkat ettiyseniz son iki örneğin üsleri negatif sayılardan oluşuyor. Negatif bir üs ondalık noktayı üs sayısı kadar sola kaydırma olarak da açıklanabilir. Bu şekilde 0.64E-3, 0000.64E-3 (yine istediğiniz kadar 0 koyabilirsiniz) olarak yazılabilir ve E-3'e bakarak ondalık noktayı 3 basamak sola kaydırıp 0.000064 sayısını elde edersiniz. Şimdi mantis, taban, üs ve normalizasyon kavramlarının anlaşılmaz olmadıklarını görmüş olduk. Bu floating-point düzeninde yazılamayan herhangi bir sayı var mı? Eğer üs herhangi büyüklükte bir sayı olabiliyorsa, yanıt “Hayır, bütün sayılar floating-point düzeninde yazılabilirler.” olacaktır. Negatif sayılar negatif bir mantis ile yazılırlar. Negatif mantis'i (0'dan daha küçük sayı) negatif üs ile (ondalık noktayı sola kaydırma) karıştırmayın. Floating-point temsilinin en büyük yararlarından biri çok büyük sayı değerlerini sınırlı bir boşlukta saklayabilmektir. 100,000 sayısını normalize floating-point karşılığı olan 0.1E6 ile karşılaştırın. Bu sayının karesi olan 10,000,000,000 sayısı 0.1E11 olarak yazılırken bu karenin 30 sıfırlı kübünün floating-point yazılışı sadece 0.1E31'dir. 0'a çok yakın küçük sayılar için de benzer bir saklama avantajı vardır. Bazı bilgisayarların içindeki çiplerdeki devreler arasındaki uzaklık 2 mikron olabilmektedir (veya daha az). Bu metrenin 2 milyonda biri olan uzaklık, yani 0.000,002m normalize floating-point olarak 0.2E-5 olarak rahatlıkla yazılabilir. Floating-point notasyonu aynı zamanda “sabit nokta” notasyonundan daha etkilidir. Sabit nokta notasyonunda ondalık noktanın sağında sadece belli sayıda basamak bulunabilir. Örneğin bu sayı 2 ise 123.2345 sayısı 123.23 olarak saklanır. Noktadan sonra ikinci basamağın gerisi de kalan basamaklar yuvarlak hale getirilir veya atılırlar. Sabit nokta notasyonunun dezavantajı gösterilmesi mümkün en küçük pozitif sayının 0.01 (2 basamaklı sabit nokta düzeninde) olmasıdır. 0.0032 gibi daha küçük bir sayı yalnızca 0.00 olarak gösterilebilir. Floating-point notasyonu da ondalık basamakların sayısını 2'yle sınırlayabilir, ancak yine çok küçük değerleri gösterebilecektir: 0.0032'nin, 0.32E-2 olduğu gibi.

İKİLİK SAYILAR DÜNYASI

Hemen hepimiz bilgisayarların bilgilerini 0 ve 1'lerden oluşan binary (ikilik) sayılar şeklinde sakladıklarını biliyoruz. Binary kelimesi “2 tabanlı” sayı sisteminin diğer ismidir. Bu arada floating-point değerlerin daha önceki örneklerde olduğu gibi taban yerine esasen 2'li tabanda saklandıklarını tahmin edebilirsiniz. Gerçekte de bu böyledir. Sayılar, bilgisayar içinde normalize 2 tabanlı düzende saklanırlar. Okuyucuların muhtemelen çoğu ikilik tamsayılarla önceden ilgilenmişlerdir: 2'li tabanda 1101 (1101_2 şeklinde gösterilir) 10'lu tabanda 13'e eşittir. 11111111 = 255 vb. Ondalık sayı sisteminde her basamağın 10'un bir katını (basamak değeri) temsil ettiği gibi binary veya ikili sayı sisteminde her basamak 2'nin belirli bir katına eşittir. Örneğin 1504 ondalık sayısı için “1000'ler basamağında 1, 100'ler basamağında 5, 10'lar basamağında 0, 1'ler basamağında 4” bulunduğunu düşündüğümüz gibi 1101 ikilik sayısını “8'ler basamağında 1, 4'ler basamağında 1, 2'ler basamağında 0, 1'ler basamağında 1” şeklinde görebiliriz. Hesaplama (1*8 + 1*4 + 0*2 + 1*1) ondalık karşılık olarak 13 sayısını verecektir. Şimdiye kadar tamsayılarla uğraştık. Bir de kesirler var. 0.5 ondalık kesrini ikilik sayı olarak nasıl gösterebiliriz? Çok basit, on'lu tabanda 0.5 = iki'li tabanda 0.1'dir. Yine her şey basamak değerlerine dayanıyor. On'lu tabanda ondalık noktanın sağındaki ilk basamak 10'da birleri (1/10), ikinci basamak yüz'de birleri vb. temsil eder. İkilik sistemde, ikilik noktanın (diğer ismi radix noktası) sağındaki ilk basamak yarımları (1/2), sonraki basamak dörtte birleri, sonraki sekizde birleri, sonra da onaltıda birleri vb. temsil ediyor. Böylece 0.1101 ikilik kesri şu şekilde açıklanabilir:

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