Machine Epsilon

Bilgisayar biliminde genel bir terim olan, kullandığımız bilgisayarlarin precision’ının ne kadar olacağını yani sayısal hesaplama sınırına makine epsilonu (machine epsilon) denir.

Rounding yani yuvarlama denilen kavram ise gerçek hayattaki reel bir sayının floating point number sistemindeki karşılığına denk gelen sayının belirlenmesine yarayan bir sabittir. Bir sayı sistemindeki yuvarlama işleminde ise karşılaşılabilecek en büyük nispi hataya makine epsilonu denir. Terimsel ifadesine baktığımızda bilgisayarımızda 1 sayısı ile bir sonraki en yakın reel sayı arasındaki farka makine epsilonu da denmektedir.

Makine epsilonu kısaca hesaplamalarımızda çıkan mutlak nispi doğru hata için üst sınıra denmektedir. Bilgisayarda epsilondan daha küçük sayıları hesaplayamayacağınızdan dolayı hatayı epsilonun altına düşürdüğümüzde en doğru sonuca yaklaşmış olursunuz. (upper bound on the absolute relative true error).

Şimdi bilgisayarımızda makine epsilonunu farklı dillerde yazılmış kodlarla nasıl bulabileceğimize bir bakalım. İlk olarak MATLAB’te bu operasyonu gerçekleştirelim.

Normalde Matlab’te machine epsilon değerine ulaşmak isterseniz eps komutunu yazmanız yeterli olacaktır. Diğer dillerde de genellikle bu komutla bulunur.

eps (epsilon yani ε) : floating point bağıl doğruluğu (floating point relative precision) 2e-52

epsmach = 1
while(1+epsmach)>1
  epsmach=epsmach/2
end
epsmach = epsmach *2

İlk önce kesinlikle birden büyük olması için bir pozitif sayı seçtik, seçtiğimiz sayı (1+epsmach). Sonra bu sayıyı 1’den daha büyük kalacak fakat tanınmayacak hâle gelene kadar iki ile bölüp çarptık. Genel olarak bu şekilde veya farklı algoritmalar ile de bu sayı değerine ulaşılabilir.

Python’da epsilonu bulmaya yarayan kısa kod şudur:

print(numpy.finfo(float32).eps)

Veya aşağıdaki algoritma sayesinde de bulunabilir:

epsilon=1.0;
while (1.0 + 0.5 * epsilon) != 1.0:
    epsilon = 0.5 * epsilon
    print("Python epsilon =", epsilon)

C dilinde ise şu şekilde konsoldan da çıktı alarak bulabilirsiniz:

#include <stdio.h>
  int main(void)
  {
      float floatEps = 1;
  

      while (1 + floatEps / 2 != 1)
          floatEps /= 2;
  

      printf("c float eps = %e\n", floatEps);
  
    
      double doubleEps = 1;
  

      while (1 + doubleEps / 2 != 1)
          doubleEps /= 2;
  

      printf("c double eps = %e\n", doubleEps);
  

      long double ldoubleEps = 1;
  

      while (1 + ldoubleEps / 2 != 1)
          ldoubleEps /= 2;
  

      printf("c long double eps = %e\n", ldoubleEps);
}