10-29-2012
|
#2
|
Prof. Dr. Sinsi
|
Bilgisayar Aritmetiği
Aritmetik taşma
Mantık devrelerinde taşma, devrenin sağladığı bit alanının işlem sonucunda ortaya çıkan verinin elde bulunan saklama alanına sığmaması durumunda olur
Taşma (Overflow)
İkiye tümleyen (two’s complement) biçiminde tutulan tüm sayılarda bir sınır vardır 4 bitlik bir tamsayıyı ikiye tümleyen biçiminde gösterirken temsil edilebilen en büyük tamsayı değer 7 (0111), en küçük tamsayı değer ise -8 (1000)’dir Bu şekilde 9’u göstermek mümkün değildir, yani dörder bitlik gösterimde var olan 5 (0101) ve 4 (0100) sayılarının toplamını 4 bitle göstermek mümkün değildir
0101 + 0100 = 1001
Örnekte de görüldüğü gibi cevap 4 bitlik gösterimde -7 olur Bu duruma daha birçok örnek verilebilir Karşılaşılan bu probleme Taşma (Overflow) adı verilir Taşma, hesaplama sonucunda gösterilebilir alanın dışına bir değerin düşmesiyle ya da işaret bitinin (sign bit) toplama sonucu değişmesiyle meydana gelebilir
İkiye tümleyeni kullanırken bu durum iki pozitif tamsayıyı ya da iki negatif tamsayıyı kendi aralarında toplarken oluşabilir İki durumda da sorun sonucun işaret bitini kontrol ederek saptanabilir Pozitif sayıların toplamının negatif olarak ve negatif sayıların toplamının pozitif olarak ortaya çıkmasından Taşma olduğu anlaşılabilir Fakat sayı işaretsiz (unsigned) olduğunda bu yöntem kullanılamaz İşaretsiz tamsayılar genellikle taşmanın yok sayıldığı bellek adreslerinde kullanılır Bilgisayar tasarımcısı taşmanın hangi durumlarda tespit edilip hangilerinde yok sayılacağını önceden belirlemelidir MIPS’in bunun için sunduğu iki çözüm vardır:
( MIPS yapısı )
Add (add), add immediate (addi) ve subtract (sub) taşmaya neden olabilir
Add unsigned (addu), add immediate unsigned (addiu) ve subtract unsigned (subu) taşmaya neden olmaz
C programlama dilinde taşma yok sayıldığından dolayı, MIPS C derleyicileri değişken türleri ne olursa olsun aritmetik işlemlerin işaretsiz versiyonları olan addu, addiu ve subu’yu kullanır MIPS Fortran derleyicileri ise aritmetik işlemleri işlenenlerin (operands) türüne göre seçer
Tabii ki günümüzde birçok bilgisayar burada verilen örneklerden çok daha uzun bit örüntüleri (bit pattern) kullandığından daha büyük değerler sorunsuz, taşma olmadan toplanabilir ve saklanabilir Bugün bilgisayarlarda genellikle kullanılan 32 bitlik örüntülerde ikiye tümleyen biçiminde pozitif değerler için 2 147 483 647’ye kadar değer tutulabilir ( Bilgisayar mimarisi ) Eğer daha büyük değerler gerekirse daha uzun bit örüntüleri kullanılabilir veya ölçüm değerleri değiştirilebilir Örneğin ölçümleri santimetre yerine metre olarak yapmak hem daha küçük değerler kullanılmasını sağlar hem de halen gereken hassaslığı ve isabetliliği sağlar
Önemli olan nokta bilgisayarların hata yapabilir olduğudur Bilgisayar kullanıcıları bu tehlikeden haberdar olmalıdır Bu sorun genellikle, programcılar ve kullanıcılar tarafından bilinmeden kayıtsızlıkla karşılanır ve küçük sayılardan çok büyük sonuçlar ortaya çıkabileceğini görmezden gelinir Örneğin, bilgisayarların genellikle 16 bitlik oldukları dönemde ikiye tümleyen biçiminde işlem yapan bilgisayarlarda gösterilebilir en büyük değer olan 215 = 32 768’e ve daha büyük değerlere ulaşıldığında taşma meydana gelirdi 19 Eylül 1989 günü bir hastanenin bilgisayar sistemi uzun süren bir hizmet döneminden sonra beklenmeyen bir hata meydana getirdi Bunun nedeni arızanın oluştuğu tarihin 1 Ocak 1900 tarihinden 32 768 gün sonrasına denk gelmesiydi ve makinenin tarih hesaplama sistemi 1 Ocaktan başlamak ve geçen gün sayısına göre tarih hesaplamak üzerine tasarlanmıştı Sonuç olarak 19 Eylül 1989 günü taşma yüzünden negatif bir sonuç ortaya çıktı ve bilgisayar bu sorunu kontrol altına alabilecek şekilde bir donanıma ve yazılıma sahip değildi
Üstten taşma
Kayan Nokta aritmetiğinde taşma iki türlü meydana gelebilir Bu türler overflow ve underflow olarak adlandırılır
Overflow: Pozitif bir üstün üst (exponent) alanına sığmayacak kadar büyük hale gelmesi durumuna verilen isimdir
Underflow: Negatif bir üstün üst (exponent) alanına sığmayacak kadar büyük bir hale gelmesi durumuna verilen isimdir
Kırpma (Truncation) Hataları
Rahatsız edici başka bir problemse, 1 baytlık kayan nokta sisteminde örnek olarak 2 5⁄8 ‘in saklanması istendiğinde ortaya bir sorun çıkacaktır İlk önce 2 5⁄8 ikilik sistemde yazıır; 10,101 Fakat bu ondalık(mantissa) alanına kopyalanırsa kullanılabilir alanın dışına taşmak gerekir Bu durumda en sağdaki en anlamsız bit (least significant bit) dışarıya atılır ve kaybolur Bu 1⁄8’lik bir büyüklüğün kaybolması anlamına gelir

Bu sorun görmezden gelinip üst alanı ve işaret biti doldurulursa elde edilen sonuç 01101010 olur yani 2 5⁄8 yerine 2 1⁄2 elde edilmiş olur Bu duruma Kırpma (truncation) hatası adı verilir ve sonucunda ondalık alanının yeteri kadar geniş olmamasından kaynaklı olarak değerin bir kısmı kaybolur
Bu durumda 2 1⁄2 + 1⁄8 + 1⁄8 sonucu bulunmak istendiğinde değerler yazıldığı sırayla toplanırsa 2 1⁄2 + 1⁄8 sonucu olarak 2 5⁄8 yani ikilik sistemde 10 101 elde edilir Daha önceden de görüldüğü gibi bu değer doğru olarak tutulamaz Eklenilen 1⁄8 değeri hiç eklenmemiş gibi ortadan kaybolur Sonuç olarak gelen 2 1⁄2’ye son 1⁄8 de eklediğinde yine aynı sorundan dolayı son sonuç olarak 2 1⁄2 elde edilir Fakat değerler tersten sıralanıp toplanırsa bu sorun çözülebilir 1⁄8+ 1⁄8 = 1⁄4, yani ikilik sistemde 01 sonucu elde edilir İlk aşamanın sonucu bir baytta 00111000 olarak isabetli şekilde saklanır Bu değer 2 1⁄2 ile toplanırsa 2 3⁄4 sonucu elde edilir Yani bir baytta isabetli olarak 01101011 bu sefer doğru olan sonuç tutulabilir
Özetlemek gerekirse kayan nokta biçiminde nümerik değerler eklenirken kullanılan sıralama sonucun doğru olması açısından önemlidir Bu biçimde çok büyük bir sayıya çok küçük bir sayı eklenirse küçük sayı kırpılmış (truncated) olabilir Sonuç olarak değerleri birbirine eklemek için genel kural küçük olan değerler büyük değerin yanında kaybolmayacakları umularak bir araya toplanır ve kalan büyük değerle son olarak toplama işlemi yapılır
Bu tür sorunların önemi daha uzun ondalık alanı kullanılarak azaltılabilir Aslında bugün birçok bilgisayar burada gösterilen 8 bit yerine 32 bit veya daha fazlasını kullanır Bu aynı zamanda daha uzun bir üst alanını kullanılabilir hale getirir Bu uzunluktaki formatlarda bile halen daha isabetli sonuçlara ihtiyaç duyulabilir
Günümüzde ticari yazılım paketi tasarımcıları bu konuda eğitimsiz kullanıcıları bu durumdan korumak adına iyi işler ortaya koymaktadırlar Standart bir hesap tablosu (spreadsheet) sisteminde 1016 ve daha fazla farklar olmayan sayılarda doğru cevaplar alınması beklenir Sonuç olarak, 10 000 000 000 000 000’e 1 ekleme ihtiyacı duyulursa 10 000 000 000 000 001 yerine 10 000 000 000 000 000 cevabı alınabilir
Bu tür problemler genellikle basit kullanıcılar için büyük sorunlar teşkil etmez fakat hassasiyet uçak ve gemi sistemleri, uzay araştırma araçları gibi sistemler için son derece önemli olabilir
Başka bir kırpma hatası sebebi ise gündelik hayatta kullanılan on tabanında her zaman ortaya çıkan bir problemdir: örneğin 1⁄3' ün desimal biçimde gösterilmesinde karşılaşılan ondalığın sonsuza gitmesi (nonterminating expansions) problemi Bazı değerler burada olduğu gibi kaç bit kullanılırsa kullanılsın tam olarak ifade edilemez On tabanı ve ikilik (binary) gösterim arasındaki fark ikilik gösterimde daha fazla sonsuza giden değer vardır Örneğin 0,1 ikilik sistemde tam olarak ifade edilemez Buna sorun teşkil eden bir örnek vermek gerekirse dolar ve sentlerle çalışan, bu durumdan habersiz bir insanın karşılaşacağı birçok sorun vardır Özellikle dolar genel birim olarak kullanılıyorsa “dime” isabetli olarak saklanamaz Bu durumda genel birim olarak peni kullanılmasıyla bütün değerlerin tamsayı olması ve daha isabetli sonuçlar elde edilmesi sağlanabilir
Sonuç
Taşmayla başa çıkmanın birkaç yolunu bir araya toplamak gerekirse:
Tasarım: uzunluk ve işaret tipi bakımından uygun veri türleri seçmek
Sakınma: işlem ve işlenenlerin seçiminde elde edilebilecek sonucun asla saklanabilecek sonuçtan daha uzun olmayacağına emin olmak
Kontrol etme: eğer taşma olacağı önceden tahmin edilirse veya tespit edilirse önce başka bir işlem yapılır Örneğin önce küçük olan girdiler toplanır arkasından daha büyük değerlerle toplanır İşlemciler genellikle bir ek özellik olarak bir statü biti kullanarak taşmaları tespit edip önleyebilirler
Yayılma: eğer verilen değer tutulmak için çok büyükse taşma olduğu belirtilerek özel bir değere atanabilir Üzerinde yapılacak işlemler uygulandıktan sonra bu değer döndürülür Bu yöntem değerin uzun işlemler sonunda her aşamada kontrol edilmesindense bütün işlemler bitince kontrol edilebilmesine olanak sağlar Bu özellik genellikle FPU adı verilen kayan nokta donanımlarıyla(Floating point hardware) desteklenir
Yok sayma: en fazla tercih edilen yoldur fakat yanlış sonuçlar verebilir ve programın güvenilirliğini tehlikeye atabilir
Sıfıra bölünme bir taşma değildir Matematiksel olarak sıfıra bölünme tanımsızdır
|
|
|