9.11. math.h: Matematiksel Yordamlar
Bu dosya, birtakım kayan noktalı matematik yordamları tarafından hata
durumunda döndürülen bir değeri ifade etmek için HUGE_VAL adlı
double değerindeki makroyu bildirir.
(float ve long double tipleri
için, sırasıyla, HUGE_VALF ve HUGE_VALL makroları
tanımlanmıştır.) INFINITY ve NAN makroları da,
eğer ortam tarafından destekleniyorsa, sırasıyla, sonsuzluk
ve
sayı değil
değerlerini tanımlar.
Bu dosyada tanımlanan diğer makrolar arasında;
fmafonksiyonu ile ilgili olanFP_FAST_FMA,FP_FAST_FMAFveFP_FAST_FMAL;ilogbfonksiyonu ile ilgili olanFP_ILOGB0veFP_ILOGBNANvemath_errhandlingmakrosu ile ilgili olanMATH_ERRNOveMATH_ERREXCEPT
bulunmaktadır.
Ayrıca, fonksiyona benzeyen altı adet sınıflandırma
makroları
bulunmaktadır (burada x gerçek kayan noktalı bir ifadedir):
int fpclassify(x) int isfinite(x) int isinf(x) int isnan(x) int isnormal(x) int signbit(x)
Bu dosyada bildirimleri yapılan fonksiyonların çalışması sırasında
oluşan etki alanı hatası veya taşma durumlarını göstermek için
((math_errhandling & MATH_ERRNO) != 0 durumunda)
sırasıyla EDOM veya ERANGE değeri
errno değişkenine atanır. Eğer
(math_errhandling & MATH_ERREXCEPT) != 0 ise,
kayan nokta istisnası oluşur.
Dosyada float_t ve double_t
tipleri tanımlanmıştır. Bu tiplerin gerçek karşılığı
programcı tarafından tanımlanan FLT_EVAL_METHOD
makrosunun değerine bağlıdır. Eğer değeri 0 ise,
float_t ve double_t’nin
karşılığı, sırasıyla, float ve
double’dır. Eğer
FLT_EVAL_METHOD’un değeri 1 ise,
her iki tipin karşılığı double;
eğer değeri 2 ise, her iki tipin karşılığı
long double’dır.
Ancak, her durumda double_t tipi en azından float_t
tipi genişliğinde bir tiptir.
Aşağıda verilen her fonksiyon prototipi için, ikişer adet daha
fonksiyon prototipi bulunmaktadır. Aldığı argümanlar ve duruma göre döndürdüğü
değer double yerine float
olan fonksiyonlar aynı isimle,
fakat ismin sonuna bir
harfi eklenerek tanımlanmıştır.
Benzer şekilde, flong double argüman alıp, duruma göre
long double değer döndüren fonksiyonların ismine de
eklenerek ulaşılabilir. Örneğin,
lcos yerine cosf ve cosl.
Trigonometrik Fonksiyonlar
double acos(double x) double asin(double x) double atan(double x) double atan2(double y, double x) double cos(double x) double sin(double x) double tan(double x)
Hiperbolik Fonksiyonlar
double acosh(double x) double asinh(double x) double atanh(double x) double cosh(double x) double sinh(double x) double tanh(double x)
Üstel Ve Logaritmik Fonksiyonlar
double exp(double x) double exp2(double x) double expm1(double x) double frexp(double deger, int * us) int ilogb(double x) double ldexp(double x, int us) double log(double x) double log10(double x) double log1p(double x) double log2(double x) double logb(double x) double modf(double deger, double * tsg) double scalbn(double x, int n) double scalbln(double x, long int n)
Güç Ve Mutlak Değer Fonksiyonları
double cbrt(double x) double fabs(double x) double hypot(double x, double y) double pow(double x, double y) double sqrt(double x)
Hata Ve Gama Fonksiyonları
double erf(double x) double erfc(double x) double lgamma(double x) double tgamma(double x)
En Yakın Tamsayı Fonksiyonları
double ceil(double x) double floor(double x) double nearbyint(double x) double rint(double x) long int lrint(double x) long long int llrint(double x) double round(double x) long int lround(double x) long long int llround(double x) double trunc(double x)
Kalan Fonksiyonları
double fmod(double x, double y) double remainder(double x, double y) double remquo(double x, double y, int * bolp)
İşleme Fonksiyonları
double copysign(double x, double y) double nan(const char * eg) double nextafter(double x, double y) double nexttoward(double x, long double y)
Enbüyük, Enküçük Ve Pozitif Fark Fonksiyonları
double fdim(double x, double y) double fmax(double x, double y) double fmin(double x, double y)
Kayan Noktalı Çarp-Topla Fonksiyonu
double fma(double x, double y, double z)
Karşılaştırma Makroları
C’deki karşılaştırma işleçleri eğer NaN
(sayı değil) kayan noktalı işlenenlerle kullanılırsa,
programda geçersiz
istisnasının
ortaya çıkmasına neden olabilir. Bu işleçler yerine, aşağıdaki makrolar
kullanıldığında böyle durumlarda bile geçersiz
istisnası
ortaya çıkmaz (burada x ve y gerçek kayan noktalı
ifadelerdir):
int isgreater(x, y) int isgreaterequal(x, y) int isless(x, y) int islessequal(x, y) int islessgreater(x, y) int isunordered(x, y)
FP_CONTRACT Pragması
FP_CONTRACT pragması, ON
durumunda iken, birkaç C işleciyle oluşturulmuş kayan noktalı ifadelerin
derleyici tarafından mümkünse daha az makine işlemine dönüştürülmesine
olanak tanır. Bu şekilde daraltılmış ifadelerin yürütülmesi daha hızlıdır.
Ancak, yuvarlama hatalarını da ortadan kaldırdıkları için,
daraltılmamış ifadelerle tam olarak aynı sonuçları vermeyebilirler.
Ayrıca, daraltılmamış bir ifadede ortaya çıkabilecek kayan nokta istisnaları,
karşılık gelen daraltılmış ifadelerin işlenmesi sırasında ortaya çıkmayabilir.
Daraltılmaların nasıl gerçekleştirileceği ve ifadelerin varsayılan olarak
daraltılıp daraltılmayacağı derleyiciye bağlıdır.