Aritmetik taşma

Ö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.

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.

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 tam sayı olması ve daha isabetli sonuçlar elde edilmesi sağlanabilir.

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.