Standart C Programlama Dili


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 olan FP_FAST_FMA, FP_FAST_FMAF ve FP_FAST_FMAL;
  • ilogb fonksiyonu ile ilgili olan FP_ILOGB0 ve FP_ILOGBNAN ve
  • math_errhandling makrosu ile ilgili olan MATH_ERRNO ve MATH_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 f harfi eklenerek tanımlanmıştır. Benzer şekilde, long double argüman alıp, duruma göre long double değer döndüren fonksiyonların ismine de l eklenerek ulaşılabilir. Örneğin, 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.