IEEE 754 kayan nokta gerçeklemeleri denetim sözcüğündeki bitleri ayarlayarak oluşacak her olağandışılık için kapanlar olup olmayacağına yazılımcının karar vermesini mümkün kılar. C'de kapanlar yazılımın
SIGFPE sinyali almasıyla sonuçlanır; bkz.
Sinyal İşleme.
| Not |
---|
IEEE 754 sinyal eylemcilerin olağandışı durumların ayrıntılarının verildiği ve sonuç değerin ayarlandığı yerler olduğunu söyler. C sinyalleri bu bilginin ileri ya da geri aktarılması için herhangi bir mekanizma sağlamaz. C'de olağandışılıkların yakalanması bundan dolayı çok elverişli değildir. |
Bazı hesaplamaları yaparken kayan nokta biriminin durumunun kaydedilmesi kimi zaman gerekli olur. Kütüphane, kapanları üreten olağandışılıkları ve yuvarlama kiplerini kaydetmeyi ve gerektiğinde eski durumuna getirmeyi sağlayan işlevler sağlar. Bu bilgiler kayan nokta ortamı olarak bilinir.
Kayan nokta ortamını kaydeden ve eski durumuna getiren işlevlerin hepsi bilgiyi saklamak için fenv_t türünde bir değişken kullanırlar. Bu veri türü fenv.h dosyasında tanımlanmıştır. Türün genişliği ve içeriği gerçeklemeye bağlıdır. Bu türdeki bir değişkenin değerini doğrudan değiştirmeye çalışmamalısınız.
Kayan nokta biriminin durumunu kaydetmek için bu işlevlerden birini kullanın:
int fegetenv | (fenv_t *ortam) |
işlev
Kayan nokta ortamını ortam ile gösterilen değişkende saklar.
İşlem başarılıysa işlev sıfırla aksi takdirde sıfırdan farklı bir değerle döner.
int feholdexcept | (fenv_t *ortam) |
işlev
O anki kayan nokta ortamını ortam ile gösterilen nesnede saklar ve tüm olağandışılık bayraklarını temizledikten sonra kayan nokta birimini hiçbir olağandışılığı yakalamamaya ayarlar. Hiçbir olağandışılığın yakalanmamasını kayan nokta birimlerinin hepsi desteklemez; eğer feholdexcept bu kipi ayarlayamıyorsa, sıfırdan farklı bir değer döner. Başarırsa sıfırla döner.
Kayan nokta ortamını eski durumuna getiren işlevlerin alabildiği argüman çeşitleri:
Kayan noktalı ortamı etkin kılmak için şu işlevleri kullanabilirsiniz:
int fesetenv | (const fenv_t *ortam) |
işlev
ortam ile açıklanan kayan noktalı ortamı etkin kılar.
İşlev başarılı olduğunda sıfırla, aksi takdirde sıfırdan farklı bir değerle döner.
int feupdateenv | (const fenv_t *ortam) |
işlev
fesetenv gibi bu işlev de ortam ile açıklanan kayan noktalı ortamı etkin kılar. Ancak, bu işlevin çağrısından önce durum sözcüğü bayraklı herhangi bir olağandışılık varsa çağrıdan sonra da bayraklı olarak kalır. Başka bir deyişle, bu işlevin çağrısından sonra önceki durum sözcüğü ile ortam içinde kayıtlı olan bit seviyesinde VEYAlanır.
İşlev başarılı olduğunda sıfırla, aksi takdirde sıfırdan farklı bir değerle döner.
Olağandışılıklar ortaya çıktığında bir kapanın oluşmasına sebep oluyorsa, bu olağandışılıkları tek tek aşağıdaki iki işlevle denetim altında tutabilirsiniz.
| Taşınabilirlik Bilgisi |
---|
Bu işlevlerin hepsi GNU oluşumudur. |
int feenableexcept | (int olağandışılıklar) |
işlev
olağandışılıklar parametresi ile belirtilen olağandışılıkların her biri için kapanları etkinleştirir. Olağandışılıklar tek tek
Kayan Nokta Birimi Durum Sözcüğünün İncelenmesi bölümünde açıklanmıştır. Sadece belirtilen olağandışılıklar etkinleştirilir, diğer olağandışılıkların durumu değiştirilmez.
İşlev başarılı olduğunda evvelce etkinleştirilmiş olağandışılıklarla döner, aksi takdirde -1 ile döner.
int fedisableexcept | (int olağandışılıklar) |
işlev
olağandışılıklar parametresi ile belirtilen olağandışılıkların her biri için kapanları iptal eder. Olağandışılıklar tek tek
Kayan Nokta Birimi Durum Sözcüğünün İncelenmesi bölümünde açıklanmıştır. Sadece belirtilen olağandışılıklar iptal edilir, diğer olağandışılıkların durumu değiştirilmez.
İşlev başarılı olduğunda evvelce etkinleştirilmiş olağandışılıklarla döner, aksi takdirde -1 ile döner.
int fegetexcept | (int olağandışılıklar) |
işlev
Bu işlev o an etkin olan olağandışılıklar ile döner. -1 dönmüşse bir hata oluşmuş demektir.