Gerçek sayılarla yapılan hesaplamalarda dahili hassasiyet daha yüksektir ve hedef türe sığacak şekilde yuvarlama yapılır. Bu, sonuçların girilen veri kadar hassas olmasını sağlar. IEEE 754 dört olası yuvarlama kipi tanımlar:
- En yakına yuvarlama
Bu öntanımlı kiptir. Diğer kiplerden birine özellikle ihtiyaç duyulmadıkça kullanılması gereken kip budur. Bu kipte sonuçlar gösterilebilen en yakın değere yuvarlanır. Sonuç iki gösterilebilen değerin ortasındaysa çift sayı olanı seçilir. Burada "çift" en düşük seviyeli biti sıfır olan anlamındadır. Bu yuvarlama kipi istatistiksel sapmadan korur ve sayısal kararlılığı garantiler: uzunca bir hesaplamada yuvarlayamama hataları FLT_EPSILON'un yarısından daha küçük kalacaktır.
- Artı sonsuza yuvarlama
Tüm sonuçlar, sonuçtan daha büyük olan gösterilebilir en küçük değere yuvarlanır.
- Eksi sonsuza yuvarlama
Tüm sonuçlar, sonuçtan daha küçük olan gösterilebilir en büyük değere yuvarlanır.
- Sıfıra yuvarlama
Tüm sonuçlar, sıfıra en yakın gösterilebilir en büyük değere yuvarlanır. Başka bir deyişle, negatif sonuçlar üste, pozitif sonuçlar alta yuvarlanır.
fenv.h dosyasında tanımlanan sabitleri yuvarlama kiplerini belirtmek için kullanabilirsiniz. Her biri yalnız ve yalnız kayan nokta birimi ilgili yuvarlama kipini destekliyorsa tanımlıdır.
- FE_TONEAREST
- FE_UPWARD
- FE_DOWNWARD
- FE_TOWARDZERO
Alttan taşma gereksiz bir durumdur. Normalde, IEEE 754 kayan noktalı sayıları daima normalleştirilirler (bkz.
Gerçek Sayı Gösterimi ile İlgili Kavramlar).
2^r'den küçük sayılar (burada r en küçük üstür ve
float türü için
FLT_MIN_RADIX-1'dir) normallşetirilmiş sayılar olarak gösterilemezler. Böyle sayıların sıfıra ya da
2^r'ye yuvarlanması bazı algoritmaların sıfırda başarısız olmasına sebep olur. Bu bakımdan bunlar normalleştirilmemiş şekilde kalır. Ondalık kısmın bazı bitleri ondalık noktayı göstermek için kaynayıp gittiğinden bu hassasiyet kaybına sebep olur.
Eğer bir sonuç bir normalleştirilmemiş sayı olarak göstremek için bile çok küçükse sıfıra yuvarlanır. Yine de, sonucun işareti korunur; eğer hesaplama negatifse sonuç eksi sıfırdır. Negatif sıfır değeri ayrıca 4/-oo gibi sonsuz değeri kullanılan işlemlerinde sonucu olur. Negatif sıfır, işaret bitini signbit veya copysign ile doğrudan sınanmadıkça tüm hesaplamalarda sıfır gibi davranır.
Herhangi bir anda yukarıdaki dört yuvarlama kipinden biri seçilidir. Hangi kipin seçili olduğunu şu işlevle bulabilirsiniz:
O an seçili olan yuvarlama kipini yuvarlama kipini tanımlayan makrolardan birinin değeri olarak döndürür.
Yuvarlama kipini değiştirmek için şu işlevi kullanın:
int fesetround | int yuvarlama) |
işlev
O an seçili yuarlama kipini yuvarlama kipi olarak değiştirir. Eğer yuvarlama değeri desteklenen yuvarlama kiplerinden birine karşılık değilse hiçbir değişiklik yapılmaz. İşlev kipi değiştirebilmişse sıfırla, kip desteklenmiyorsa sıfırdan farklı bir değerle döner.
Mümkünse, yuvarlama kipini değiştirmekten kaçınmalısınız. Masraflı bir işlem haline gelebilir; ayrıca bazı donanımlar yazılımınızın çalıştığından farklı derlenmesini gerektirebilir. Sonuçlanan kod daha yavaş çalışabilir. Daha ayrıntılı bilgi için derleyicinizin belgelerine bakınız.