17 Haziran 2014 Salı

IEEE 754 ve Yuvarlama

Not : Konuyla ilgili olarak IEEE 754 başlıklı yazıya göz atabilirsiniz.

Yuvarlama İşlemleri
Yuvarlama (rounding) küsuratlı sayının tam sayıya çevrilmesi demek. 


Standart Yuvarlama Yöntemleri
Burada yuvarlama formüllerini gösteren güzel bir şekil var. Bir çok programlama dili bu yuvarlama yöntemini metod olarak sunuyor.


Round (Away FromZero) aşağıdaki gibi gerçekleştirilebilir

Standart Olmayan Yuvarlama Yöntemleri
Aşağıda programlama dilleri tarafından sunulmayan ve pek te karşımızı çıkmayan yuvarlama yöntemlerini not ettim.

Eksiyi Koruyan Ceil
Buradaki örnekte ceil'in tersine eksi sayılar daha da küçülüyor.
f(0.1) = 1
f(-0.1) = -1
f(0.0) = 0
İki şekilde kodlanabilir.
rounded = Math.ceil(Math.abs(toBeRounded)) * Math.signum(toBeRounded);
veya
rounded = Math.copySign(Math.ceil (Math.abs(toBeRounded)),toBeRounded);


Sayıyı Başka Bir Sayının Katı Olacak Şekilde Yuvarlama
Örneğin 201 gibi bir sayı 300'e yuvarlanır. 14 sayısı 100' yuvarlanır.
Algoritma aşağıdakine benzer
int round (int number,int multiple){
    int result = multiple;

    //If not already multiple of given number
    if (number % multiple != 0){
        int division = (number / multiple)+1;
        result = division * multiple;
    }
    return result;
}
Burada da benzer bir cevap var ancak genel bir algoritma sunmamış.

Bir diğer yöntem ise aşağıda. Kolay okunsun diye parantezleri renklendirdim.
#define ROUND_UP (x,multiple) ( (int) (x)+ (multiple -1) ) ) & ~ (multiple -1)

#define ROUNDA_DOWN (x,multiple) ( (int) (x) & ~ (multiple -1) )

C
ceil
ceil() ve ceilf aynı işlevi görürler. Kabaca şöyledirler:
return ( (v < 0.0 ) ? v : (v +1) );

floor
floor() kabaca şöyledir.
return ( (v < 0.0) ? ( v - 1.0) : v ); 

round ve roundf
Bu metodlar verilen kayan sayıyı en yakın integer'a yuvarlar. 

Yuvarlama yönünü fegetround() ve fesetround() metodları ile değiştirebiliriz.

Sayıyı belli bir küsürata yuvarlamak için round() metodu dışında, buradaki  gösterildiği gibi floorf veya ceilf metodları kullanılabilir.

C++
Yuvarlama işlemi fesetround() ile yapılır. Örnek:
Java
Math.Floor ve Math.Ceil metodları var.

Yuvarlama yaparken kaç hane istediğimizi belirtmek istersek aşağıdaki kodu kullanabiliriz.
static Double round(Double d, int precise) {
    BigDecimal bigDecimal = new BigDecimal.valueOf (d);
    bigDecimal = bigDecimal.setScale(precise, RoundingMode.HALF_UP);
    return bigDecimal.doubleValue();
}

C#
Aynı Java'daki gibi Math.Floow ve Math.Ceil metodları var.
Math.Ceiling(num) // Rounds up
Math.Floor(num) // Rounds down
Math.Round ile yuvarlamak yöntemi ve kaç hane istendiği belirtilebilir. Örnek:
Math.Round(value, 2, MidpointRounding.AwayFromZero);
SQL
round metodu ile haç haneye kadar yuvarlama istendiği belirtilebilir.


Hiç yorum yok:

Yorum Gönder