Skip to main content

CPU düzeyinde hesaplama - Binary Floating Point hatasi

Bilgisayar dilinde binary sistemi kullanıldığından ne yazık ki 0.1, 0.2, 0.3 gibi sayılar tam değer olarak gösterilememektedir. 
Bu yüzden kod derlenirken/çalıştırılırken 0.1 gibi değerler, bu sayıya en yakın değere round edilir.

ÖRN: 0.1=0.00011001100110011001100110011001100110011001100110011001100110... veya 
0.3  = 0.01001100110011001100110011001100110011001100110011001100110011... şeklinde gösterilmektedir.
  
Yukarıdaki örneklerde görüldüğü üzere Round edilme kısmında küçük de olsa rounding error denilen bir kayıp yaşanıyor.  

Diğer taraftan ondalık sayı sisteminde 1/3 olarak belirtilen bir sayı 0.33 olacak diye kabul edelim, 0.33+0.33+0.33 toplamı ne yazık ki tam istenen sonucu vermiyor(1 eklenmediği sürece).

1/3 = 0.3333333... şeklinde de kabul edilebilir; fakat bilgisayar ortamında kullanılan alanın (memory) sınırlı olmasından dolayı, virgülden sonraki kesirli değerlerin bir yerde durdurulması gerekmektedir. Çoğu  hesaplamada çok küçük bir kayıp yaşatacak olan 17. satırdan sonraki değerin pek bir önemi olmuyor(değer tam olmadığı için). (Genellikle floating pointte virgül sonrası ilk 17 değer alınıyor)

CPU düzeyinde yapılan hesaplamarda 0.1 + 0.2 =  0.3 olamamaktadır.

ÖRN: 0.1 + 0.2 =  0.30000000000000004441 şeklinde bir sonuc vermektedir.


(Tabloya atılan kayıtlarda 74,75 olması gerekirken, 74,749999999... şeklinde kayıtların olması buna güzel bir örnek olabilir)

CPU (hardware) düzeyinde yapılan hesaplamalrda decimal -> binary veya binary sayı dizisinden -> ondalık (decimal) sayı dizisine çevirme işlemlerinde yaşanan bu kayıpları önlemek için Binary Floating Point (BFP) formatında IEEE standardı belirlenmiştir.
Binary floating point sayıları hardware ve bütün programlama dillerinde aynı formatta kullanılıyor, buna da IEEE 754 standardı adı verilmiş. Bu formatın CPU düzeyinde 32 ve 64 bit için farklı değer aralığı mevcut.

Örnek Kotlin Kodu:



CPU düzeyinde yapılan hesaplamalarda  0.1 + 0.3 değeri tam olarak 0.4 değildir ama bu değere çok yakındır. Çoğu programlama dili (IEEE 754 standardından dolayı) bu değeri floating point yerine 0.4 olarak formatlayacak şekilde göstermektedir.


Peki, bu problemi yaşamamak için neler yapılabilir?


 - Para gibi net değerler için DECIMAL data types kullanılabilir. (seedecimal data type
  NUMERIC(M,N)
  DECIMAL(M,N)

- Virgülden sonra bir sürü sayı görmemek için: sonuç değeri istenen formatta ROUND edilebilir
  ROUND()
  TRUNC()

- Eğer kullanılan sisteminde decimal data types yoksa o zaman bir diğer alternatif olarak INTEGER type ile çalışılabilir(see: integer data types)


Refrences:
http://grouper.ieee.org/groups/754/
https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
https://docs.python.org/2/tutorial/floatingpoint.html#representation-error

Comments

Popular posts from this blog

Vodafone'da Sms Gönderimi için Bakiyeniz Yetersizdir Sorunu Çözüldü

Vodafone'nun sms gönderimi için bakiyeniz yetersizdir Sorunu Çözüldü!.

How to Hack WhatsApp Account Bluestack

How to hack WhatsApp account??? WhatsApp is currently one of the most secure messaging services purely because it works with a particular phone number and requires a certain code.

Simply Hacking Facebook Account with Kali Linux

Hi guys, today I will show you how to hack a Facebook account with  Kali Linux.

Android farkli ekran tipleri icin tasarim yapmak

Birincisi, Layout seçimi çok önemli.
     Yaptığım araştırmalar sonucunda öğrendim ki AbsouluteLayout belki de en kötü seçim. AbsoluteLayout ile öğeler için kesin bir yer belirleyebilirsiniz. Örn: position x=110px, y=180px; Fakat bu kesinlikle önerilmeyen bir durum çünkü farklı ekranlarda veya farklı çözünürlükteki Android cihazlarda kaymalar olduğunu göreceksiniz. 
     Bunun yerine RelativeLayout kullanmanızı tavsiye ederim. RelativeLayout’ta parent-view’e göre ya da diğer elemanlara göre(relatively – bunlarla bağlantılı) bir pozisyon seçileceği için, istediğiniz tasarıma en yakın görünümü elde etmek mümkün. Layout seçimini hallettikten sonra sıradaki işlem olarak farklı ekran tipleri için tasarım yapmaya geldi.

     Farklı ekran tipleri için tasarım yapmak (res/ folder)
     Android dünyasında çok sayıda ve farklı boyut ve çözünürlükte ekran tipi mevcut. Bunların hepsi için ayrı ayrı tasarım yapmak mümkün değil. Temel olarak üç farklı ekran boyutunu referans alıp(small, medium, l…

EXCELde Belli Satirlari ya da Sütunları Dondurmak, Sabitlemek

Excel'de önemli gördüğümüz üst satır -başlık- kısmını veya sol sutunu sabit tutmak, her sayfada görünmesini sağlamak artık çok kolay.