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;
fma
fonksiyonu ile ilgili olanFP_FAST_FMA
,FP_FAST_FMAF
veFP_FAST_FMAL
;ilogb
fonksiyonu ile ilgili olanFP_ILOGB0
veFP_ILOGBNAN
vemath_errhandling
makrosu ile ilgili olanMATH_ERRNO
veMATH_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, f
long double
argüman alıp, duruma göre
long double
değer döndüren fonksiyonların ismine de
eklenerek ulaşılabilir. Örneğin,
l
cos
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.