Bilgisayarda Hesaplama Hataları
Bilgisayarlar, matematiksel ifadelerin ve problemlerin çözümü için kullanılırlar. Bu çözümler yani hesaplamalar yapılırken hatalar meydana gelmektedir. Bu bölümde bilgisayarda meydana gelen hesaplama hatalarından bahsedilmiştir.
1. Bilgisayarda Sayıların Gösterimi
Bilgisayarın çalışmasının temelinde sayısal elektronik vardır. Sayısal elektronik ikili sayı sistemi temelidir ve çıkışlar iki değerden birini alır: bir (1) veya sıfır(0). Sayısal devredeki gerilimler arada değerler alabilirler ama asıl ilgilenilen gerilimleri sıfır veya bire karşılık gelen değerlerdir.
Kayan Noktalı Gösterim
Bilgisayar ortamındaki sınırlamalardan dolayı, sayıların bilgisayarda sonsuz uzunlukta gösterimi mümkün olmamaktadır. Bu sayılar bilgisayarda, bilgisayarın bellek kapasitesine bağlı olarak yaklaşık değerler ile temsil edilimektedir. Sayıların ise maksimum miktarda ve gerçeğe en yakın olacak şekilde temsilini sağlayan sisteme “kayan noktalı sayılar sistemi” denir. Bu gösterim; çok büyük, çok küçük ve gerçek sayıları göstermek için kullanılır. Bilgisayarın kaydedicisinde bulunan bir kayan noktalı sayı, d ve p ile temsil edilen iki kısımdan oluşur.
Bir ondalık kayan nokta, d.dddddd x 10p şeklinde gösterilir.
0.dddddd sayısı, anlamlı kısım ve p’de sayısının üssünü temsil etmektedir.
Örnek: 253.57 sayısı kayan noktalı gösterimde bilgisayarda, d=25357 ve p=3 olarak gösterilir.
Yani, .25357×103
İkili sistemde kayan nokta gösterimi ise, 1.bbbbbbx2bbb şeklinde gösterilir.
b, ondalık dijittir. Bu gösterim şeklinde; .bbbbbb “anlamlı kısım” ve 2’nin kuvveti de “üst” olarak isimlendirilir. Anlamlı kısmın ve üssün ikisi de ikilik sistemde yazılır.
Örnek: 40 sayısının ikili tabana göre kayan noktalı gösterimi şu şekilde hesaplanır:
İkilik sistemde, kayan noktalı gösterimde 40 sayısını yazmak için sayı 25’e bölünür. Ve 25 ile çarpılır.
40=40/25x25 = 1.25x 25
İkili sistemde; 1.01×2101 şeklinde gösterilir.
Genel olarak bir kayan nokta sayı, m. be olarak gösterilir. m mantis, b kullanılan sayı sisteminin tabanı ve e’de üst’tür. 10 tabanlı sistemde m; 0.1 ile 1 aralığında ve 2 tabanlı sistemde 0.5 ile 1 aralığında değişecektir.
Bilgisayarda Sayıların Kaydedilmesi
İkili kayan nokta gösteriminde sayılar bilgisayarda depolanır. Bilginin gösterildiği en temel birime “kelime” denir. Bu büyüklük bir dizi, iki tabanına göre yazılmış sayı veya bit’ten meydana gelir. Bilgisayarda sayılar, bir veya daha fazla kelime şeklinde saklanır. Sayının mantis ve üst kısımları ayrı ayrı depo edilir. Kayan noktalı sayıların değişik donanımlardaki uyumu için IEEE 754 standardı geliştirilmiştir. Ayrıca, bu gösterimlerde sayılar normalize edilmiştir ve üsler, üs değerini tutmakta olan bit sayısına göre saptırılmıştır.
2. Sayısal Yöntemlerde Hatalar
Yöntemlerin etkili bir biçimde kullanılmasında hata kavramının anlaşılması önemlidir. Problemin sayısal yöntem ve analitik yöntemle çözülmesi durumunda ikisi arasında ortaya çıkan fark, hata olarak tanımlanır. Sayısal yöntemlerde karşılaşılan hatalar genel olarak, yuvarlama, kesme ve bu iki hatanın toplamından oluşan toplam hata şeklinde sınıflandırılır.
Yuvarlama Hataları
Sayılar, bilgisayarlarda sonlu sayıda bit ile gösterildiğinden yuvarlama hataları, bilgisayarların bu sayıları ifade etmek için sınırlı sayıda basamak kullanılmasından kaynaklanır. [latex]\pi[/latex], [latex]e[/latex], [latex]\sqrt{7}[/latex] gibi sayılar sabit(sonlu) sayıda anlamlı basamakla yazılamaz. Bu büyüklükler belirli değerleri temsil etseler de, sabit sayıda basamakla tam olarak ifade edilemezler.
Örnek: pi=3.14159265358979…
Aynı zamanda bilgisayarlar 2 tabanına göre çalıştıklarından, 10 tabanına göre tamsayıları hassas olarak ifade edemezler. Anlamlı basamakların ihmal edilmesinden dolayı da yuvarlama hataları oluşur.
Genel olarak bir sayının n tane anlamlı basamağı olacak şekilde yuvarlaklaştırılması için, o sayının en solundaki anlamlı basamaktan başlayarak, n tane anlamlı basamak atılır. Eğer yuvarlama esnasında atılan kısım; 5, 50, 500, 5000, …’den küçük ise, korunan son basamaktaki sayı olduğu gibi bırakılır. Eğer atılan kısım; 5, 50, 500, 5000, …’den büyük ise, korunan son basamaktaki sayı, bir arttırılır. Eğer atılan kısım tam; 5, 50, 500, 5000, … ise, “çift sayılar” veya “tek sayılar” kuralı uygulanır. Çift sayılar kuralına göre korunan son basamaktaki sayı çift ise bir değişiklik yapılmaz, tek ise bir arttırılır. Tek sayılar kuralında da öncekinin tam tersi durum uygulanır. Genel olarak çift sayılar kuralı tercih edilir.
Örnek kod bloğu aşağıda verilmiştir.
>> format long >>a=1; b=-5000.001; c=5; >>kok1=(-b+sqrt(b^2-4*a*c))/(2*a); >>kok2=(-b-sqrt(b^2-4*a*c))/(2*a); >> kok1 kok1= 5000 >>kok2 kok2= 0.001000000000204
MATLAB’ın kok2 için hesapladığı değer yuvarlama hatasından dolayı tam yani doğru sonuç değildir.
Kesme Hataları
Sayısal hatalar, sayısal büyüklüklerin yaklaşık değerlerle ifade edilmelerinden ortaya çıkmaktadır. “Kesme Hatası”, gerçek ya da gerçeğe yakın değerin hesaplanmasında çok fazla veya sonsuz sayıda terim alınması durumunda meydana gelen hatadır. Sayısal işlemlerde, sonsuz uzunluktaki bir seri, belli bir kısmından itibaren kesilerek kullanılmakta ve kalan terimleri de atılmaktadır. Bu durumda kesme hataları ortaya çıkmaktadır.
Örnek: [latex] \cos (x)[/latex] fonksiyonu, Taylor Serisine açılırsa:
[latex]\cos (x)=1-\frac{x^2}{2!}+\frac{x^4}{4!}+\frac{x^6}{6!}+\frac{x^8}{8!}+\frac{x^{10}}{10!}+…[/latex] (1)
Yukarıdaki gibi yazılır. (1) Verilen herhangi bir x sayısının kosinüs değerinin hesaplanmasında, sonsuz sayıda terim kullanılamayacağından ancak belli sayıda terimle işlemler yapılacaktır. Atılan terimler kesme hatasını oluşturacaktır. (1)’deki eşitliğe göre [latex]\cos\left(\frac{\mathrm\pi}5\right)[/latex]’in tam değeri, sonsuz sayıdaki terim kullanılarak, yaklaşık değeri de sonlu sayıda terim kullanılarak belirlenmektedir.
Hesaplanan bu iki terim arasında yani tam sonuç ile yaklaşık sonuç arasında, kesme hatası olarak adlandırılan bir fark vardır. Bu fark, kullanılması gereken terim sayısına bağlı olarak ihmal edilir. Kullanılan terim sayısına göre, [latex]\cos\left(\frac{\mathrm\pi}5\right)[/latex] için kesme hatasının değeri; tam ve seri açılımında önce bir daha sonra iki terim göz önüne alındığında yaklaşık olarak hesaplanır.
[latex]\cos\left(\frac{\mathrm\pi}5\right)[/latex] ‘in tam degeri, 0.809016994374947 ‘dir.
(1)’deki seri açılımından, tek terim için yaklaşık değer, [latex]\cos\left(\frac{\mathrm\pi}5\right)=1[/latex]‘dir.
Kesme hatası, gerçek değer ile yaklaşık değer arasındaki farka eşittir. Aşağıda, gerçek kesme hatası ve yüzde mutlak gerçek kesme hatası formülleri verilmiştir.
[latex] Epsilon_g = gercek deger – yaklasik deger [/latex]
[latex] Epsilon_g = | gercek deger – yaklasik deger | x 100 [/latex]
[latex]\cos\left(\frac{\mathrm\pi}5\right)[/latex] için hesaplanan gerçek değerle tek terim kullanıldığında bulunan sonucun farkı alınırsa yüksek bir kesme hatası bulunur.
[latex] Epsilon_g = 0.809016994374947 – 1 = -0.190983005625053 [/latex]
[latex] Epsilon_g = \%19.1 [/latex] (2)
Bu, gerçek kesme hatasıdır. (2) Epsilon_g’deki g indisi hatanın gerçek hata olduğunu göstermek için kullanılmıştır. Seri açılımında iki terim için aynı hesaplamalar tekrarlanırsa; yaklaşık değer,
[latex]\cos(\frac{\mathrm\pi}5) = 1 – \cos(\frac{\left({\displaystyle\frac{\mathrm\pi}5}\right)^2}{2!})= 0.802607911978213[/latex]
olarak elde edilir ve bu durumda gerçek kesme hatası,
[latex] Epsilon_g = 0.809016994374947 – 0.802607911978213 [/latex]
[latex]= 0.006409082396735 [/latex]
[latex] \cong \%0.6 [/latex]
Epsilon_g yaklaşık olarak yüzde 0.6 olarak bulunmuştur. Yani seride iki terim kullanıldığı durumda hata değeri, tek terime göre daha düşük olarak elde edilmiştir. Buna göre daha fazla terim kullanılması durumunda hatanın gittikçe düşeceği söylenebilir.
3. Sayısal Hassasiyet
Çoğu bilim ve mühendislik uygulamalarında, hassasiyetteki küçük kayıplar çok önemlidir. Örneğin, giriş verilerindeki küçük bir değişiklik, (niteliksel ve niceliksel olarak) farklı çıktılar üretir.
Hassasiyet Problemlerinin Çözümü
Eldeki uygulamaya bağlı olarak, farklı alanlarda için farklı çözümler olacaktır. Aşağıda bahsedilen birinci ve üçüncü çözümler, gerçek sayılar üzerinde hesaplamalar yapmaktadır. İlk durumda, tamsayı aritmetiği kullanılır ve üçüncü durumda ise rasyonel veya cebirsel sayı kullanılır. Birinci yöntem hız ve kesinlik hedeflerinin aynı anda yerine getirilmesi gereken algoritmaların yer aldığı uygulamalarda ağırlıklı olarak kullanılır. Üçüncü çözüm, tam aritmetik ve hesaplama geometrisi uygulamalarında kullanılır. Sonuç olarak, yanlış bir karar vermek, programın hatalı bir sonuç üretmesini veya kilitlenmesini sağlayabilir. İkinci yöntem ise epsilon geometrisi, bilgisayar grafiklerinde benimsenen yöntemdir.
1) Tamsayı Aritmetik Kullanımı
Tam sayı aritmetiği ile çözüm, önemli bir uygulama için yeterlidir. Kayan noktalı aritmetikten kaçınılması, verimliliğe fayda sağlar. Parçaları tarar veya tarama dönüştürme işlemi ile çoğu zaman, bir adımın performansını iyileştiren diğer birçok işleme algoritmasının alt düzeyinde gerçekleştirilir ve böylece diğerlerinin performansını etkiler.
2) Epsilon Geometrisi İle Verimlilik
Epsilon geometrisi, programlama deyiminin iki ve daha üst boyutlarına genel bir yaklaşımdır. Geometrik uygulamalar dışında yaygın olarak kullanılmaktadır.
Programcılar hızlı bir şekilde kod yazmamaları gerektiği gözlemlenmiştir. Örnek kod parçacığı aşağıda verilmiştir.
float a = ...; float b = ...; if( a == b ) { ... };
Boolean koşulunun doğru olarak değerlendirilmesi pek mümkün değildir. Çözümü ise, aşağıda verilmiştir.
const float EPSILON = 1e−8; float a = ...; float b = ...; if( fabs(a − b) < EPSILON ) { ... };
3) Rasyonel Sayılar İle Doğruluk
Bir makinedeki kayan nokta değişkenleri tarafından yakalanan sayılabilir kümenin, reel sayıların yeterli bir gösterimi olduğu varsayımı kusurluysa, ilk önce gerçek sayıların kullanılmasının gerekli olup olmadığı merak edilebilir. Cebirsel sayılar (bir cebirsel denklemin çözümü olarak ortaya çıkarsa), bir sorunun girişi parçası olarak görünüyorsa, o zaman seçeneklerimiz kayan noktalı bir yaklaşım kullanmak ya da cebirsel sayılarda manipülasyonlar kullanmaktır. Ancak daha başka birçok durumda, girdi rasyonel sayılarla temsil edilebilir.
Çoğu zaman, bir algoritmanın çıktısında da birkaç basamak hassaslığa ihtiyaç duyulmaktadır. Öte yandan ara hesaplamalar, ilkel veri türleri kullanılarak güvenilir bir şekilde uygulanamaz. Dikkate alınacak problem doğrusal kümelerden (bu metnin odak noktası) oluşuyorsa, rasyonel bir sayı türü uygulamak hassasiyet doğruluğunu garanti eder. Başlangıçta, Simple_rational sınıfına uygulanmıştır.
class Simple_rational { int numerator; int denominator; ... };
Fakat böyle bir uygulama yetersiz kalacaktır. Çok nesil geometrik nesneler seviyelerinden sonra, sabit büyüklükte sayı türünde bulunan hassasiyet (bu durumda 32 bit), kullanılan rasyonel sayıların normalleştirilmesinden sonra bile yetersiz kalır. Bu sorunun cevabı, rastgele kesinliğe sahip iki tamsayıyı depolayan yeni bir Rational sınıfı tanımlamaktan geçiyor.
class Rational { BigInteger numerator; BigInteger denominator; ... };
Rasyonel sayılar kullanmak, yürütme süresinde dramatik bir artışa neden olabilir. Değişken nokta filtrelerinin kullanılması, hem doğru hem de verimli sistemler geliştirmeyi mümkün kılar.