ISO C99, kayan nokta durum sözcüğünün sorgulanması ve değiştirilmesi için işlevler tanımlamıştır. Yakalanmayan olağandışılıklar nedeniyle hesaplamanın ortasında endişelenmek yerine münasip bir zamanda bunları bu işlevleri kullanarak sınayabilirsiniz.
Bu sabitler çeşitli IEEE 754 olağandışılıklarını gösterir. Tüm kayan nokta birimleri tüm olağandışılık çeşitlerini raporlamaz. Her sabit yalnız ve yalnız kayan nokta birimi ilgili olağandışılık desteği verilerek derlenmişse tanımlıdır. Kayan nokta birimi desteğini #ifdef ile sınayabilirsiniz. Bu sabitler fenv.h başlık dosyasında tanımlıdır..
- FE_INEXACT
Kesin olmama olağandışılığı.
- FE_DIVBYZERO
Sıfırla bölme olağandışılığı.
- FE_UNDERFLOW
Üstten taşma olağandışılığı.
- FE_OVERFLOW
Alttan taşma olağandışılığı.
- FE_INVALID
Geçersizlik olağandışılığı.
FE_ALL_EXCEPT makrosu kayan nokta gerçeklemesi tarafından desteklenen tüm olağandışılık makrolarının bit seviyesinde VEYAlanmışıdır.
Bu işlevler olağandışılık bayraklarını temizlenmesini, olağandışılıkların sınanmasını ve bayraklı olağandışılık kümesinin kaydedilmesini ve eski haline getirilmesini mümkün kılar.
int feclearexcept | (int olağandışılıklar) |
işlev
Bu işlev olağandışılıklar ile belirtilenlerden desteklenen tüm olağandışılık bayraklarını temizler.
İşlev başarılı olduğunda sıfırla, aksi takdirde sıfırdan farklı bir değerle döner.
int feraiseexcept | (int olağandışılıklar) |
işlev
Bu işlev olağandışılıklar ile belirtilenlerden desteklenen olağandışılıkları oluşturur. olağandışılıklar ile birden fazla olağandışılık biti belirtilmişse, üstten (FE_OVERFLOW) ya da alttan (FE_UNDERFLOW) taşmaların kesin olmama (FE_INEXACT) olağandışılığından önce ortaya çıkması dışında hangi olağandışılıkların oluşturulacağı tanımsızdır. Üstten veya alttan taşma için kesin olmama olağandışılığının ayrıca ortaya çıkıp çıkmayacağı ayrıca gerçeklemeye de bağlıdır.
İşlev başarılı olduğunda sıfırla, aksi takdirde sıfırdan farklı bir değerle döner.
int fetestexcept | (int olağandışılıklar) |
işlev
olağandışılıklar parametresi ile belirtilen olağandışılık bayraklarının o an etkin olup olmadıklarını sınar. Bunlardan biri varsa, hangi olağandışılığın varolduğunu belirten sıfırdan farklı bir değerle döner. Aksi takdirde dönüş değeri sıfırdır.
Bu işlevlerin yaptığı işlemleri anlayabilmek için, durum sözcüğünün durum isimli bir tamsayı değişkeni olduğunu farzedelim. feclearexcept işlevi durum &= ~olağandışılıklar ifadesine, fetestexcept işlevi ise durum & olağandışılıklar ifadesine eşdeğerdir. Şüphesiz, asıl gerçekleme farklı olabilir.
Olağandışılık bayrakları yazılım içinden sadece doğrudan feclearexcept çağrısı yapılarak temizlenebilir. Bir hesaplama sırasında oluşan olağandışılıklara bakmak isterseniz, önce bayrakların hepsini temizlemelisiniz. fetestexcept işlevinin kullanımına basit bir örnek:
{
double f;
int raised;
feclearexcept (FE_ALL_EXCEPT);
f = compute ();
raised = fetestexcept (FE_OVERFLOW | FE_INVALID);
if (raised & FE_OVERFLOW) { /* … */ }
if (raised & FE_INVALID) { /* … */ }
/* … */
}
Durum sözcüğünün bitlerini doğrudan etkinleştiremezsiniz. Ancak, durum sözcüklerinin tamamını önce kaydeder ve daha sonra eski haline getirebilirsiniz. Bu işlem aşağıdaki işlevlerle yapılabilir:
int fegetexceptflag | (fexcept_t *bayrak,
int olağandışılıklar) |
işlev
Bu işlev olağandışılıklar ile belirtilenlerden o an geçerli gerçekleme tanımlı değerleri bayrak ile gösterilen değişkende saklar.
İşlev başarılı olduğunda sıfırla, aksi takdirde sıfırdan farklı bir değerle döner.
int fesetexceptflag | (const fexcept_t *bayrak,
int olağandışılıklar) |
işlev
Bu işlev olağandışılıklar ile belirtilen olağandışılık bayraklarını bayrak ile gösterilen değişkenin değerinden eski durumuna getirir.
İşlev başarılı olduğunda sıfırla, aksi takdirde sıfırdan farklı bir değerle döner.
| Not |
---|
fexcept_t türünde saklanan değerin fetestexcept işlevinden dönen bit maskesine bir benzerliği sözkonusu değildir. Hatta tür bir tamsayı bile olmayabilir. fexcept_t türünde bir değişkeni doğrudan değiştirmeye çalışmayın. |