7 – Sin(pi) Neden 0 Çıkmaz?

Merhabalar, bu yazıda Matlab veya herhangi bir programlama dilinde karşılaşmamızın olası olduğu bir sorundan bahsedeceğim. Daha önce hesaplamadıysanız, değerlerini zaten bildiğimiz sin(pi) ve cos(pi/2) yi hesaplayın. Hatta cos(3*pi/2) ve sin(2*pi)’yi de hesaplayın. Karşılaştığınız sonucun 0 olmaması şaşırtıcı görünebilir. Bu yazıda bunun sebebini açıklayacağım. Bunun mantığını anlamanın sonraki yazılarda ve olası programlama hayatınızda işe yarayacağını düşünüyorum. Döngüleri işlerken özellikle Taylor ve Macluarin serileriyle birçok fonksiyonun değerlerini hesaplamaya başladığımızda ne demek istediğim daha iyi anlaşılacaktır.

Not: Bu yazıyı anlamanız bir sonraki yazılar için gerekli değildir. Ancak yapacağınız hesaplamalarda ortaya çıkan ilginç sayıları anlamanız için elimden geldiğince yardımcı olmaya çalıştım.

Öncelikle, verdiğim bilgiler konuyla ilgili anladığım kısmı kapsamakta, zira konunun açıklaması oldukça genişleyebiliyor. Yanlışım olursa şimdiden özür dilerim. Bu konuda Wikipedi üzerinde “Floating point number” araması yaparak çok daha kapsamlı bilgi edinebilirsiniz.

Bilgisayarlar sinüs, cosinüs, exp veya başka değerleri hafızalarında tutmazlar. Zaten tutmaları da pek olası bir şey değildir(bunun için onlarca sebep sayılabilir).  Dolayısıyla elde edeceğimiz değer de belirli bir basamakla sınırlı olmak zorundadır. Bu da bir hata payını gerektirir. Bilgisayarlar hafızalarında genel olarak virgülden sonra 16 basamak tutarlar. Yani bazı hesaplamalarda 1.0 beklerken 0.99999999999.. şeklinde 16 haneli bir sayı görmemiz olağan dışı bir durum değildir. Daha sonra serilerle yaptığımız hesaplamalarda da bulduğumuz hataların yüzde hata payını bulurken hata paylarını elimizden geldiğince azaltmaya çalışacağız.

Bu 16 basamaklı sayı üzerinde oluşan ufak hatalar “round-off errors” (yuvarlama hataları) olarak geçer. Bu hataları azaltmanın farklı yolları olmasına rağmen(örnek olarak, Python altında decimal adlı modül), hesaplamalarda kullanılan yakınsamalar bizim bu hatalarımızdan oldukça daha fazla hata paylarına yol açtığı için çok fazla kullanılmazlar. Bir Python kitabında bu bilgiye rastlamıştım. Uygulamada da henüz sıkıntı yaşamadım.

Ayrıca, Matlab altında epsilon olarak kabul edilen bir sayı var. Komut satırına eps yazarak bu sayıyı elde edebiliriz: 2.2204e-16. Bu sayı Matlab altında 0’a çok yakın bir sayı olarak kabul edilir. Başta söylediğimiz değerleri hesaplarsanız bu sayıdan daha küçük değerler verdiğini görebilirsiniz.

Round-off errors’ları azaltmanın bir yolu olarak görünen hane sayısını artırmak gösterilebilir. Ayrıca şu adresi de incelemekte fayda var, round-off errors’ları azaltmak için kullanılan bir teknikmiş. Tabii o kadar hassas hesaplamalar yapmanız gerekliyse.

 
comments powered by Disqus