__TOC__
ISO/IEC 9899:2018（通称 C18）の §7.12 ''Mathematics '' の冒頭を抄訳/引用します尚、JISX3010:2003（通称 JISC）の翻訳元であるISO/IEC 9899:1999（通称 C99）とC18の間で  に関する部分は大幅に改訂・加筆されているのでJISCを出典とはしない。この点に於いて、JISCは浮動小数点演算について ''OBSOLETE'' である。。
ヘッダー  は、2つの型と多くの数学関数を宣言し、いくつかのマクロを定義しています。ほとんどのシノプシスでは、1つ以上のdoubleのパラメータ、doubleの戻り値、またはその両方を持つ主関数と、同じ名前でfとlの接尾辞を持つ他の関数からなる関数群を指定している。これらの関数は、floatとlong doubleのパラメータ，戻り値，またはその両方を持つ対応する関数である。整数演算関数と変換関数については後述する。
float_t double_t はそれぞれ float と double と同等の幅を持つ浮動小数点型で、double_t は float_t と同等の幅を持つようになっています。FLT_EVAL_METHOD が 0 の場合、float_t と double_t はそれぞれ float と double になり、FLT_EVAL_METHOD が 1 の場合、両方とも double になり、FLT_EVAL_METHOD が 2 の場合、両方とも long double になり、FLT_EVAL_METHOD が他の値の場合、それらは実装で定義されたものになります。
マクロ HUGE_VAL は正の倍数の定数式に展開しますが、必ずしも float として表現できるわけではありません。マクロ HUGE_VALF HUGE_VALL は、それぞれ HUGE_VAL の float および long double のアナログです。
マクロ INFINITY は、正または符号なしの無限大を表す float 型の定数式があれば、それに展開します。
マクロ NAN は、実装が float 型の 静かなNaN(''quiet NaNs'') をサポートする場合にのみ定義されます。このマクロは、静かな NaN を表す float 型の定数式に展開されます。
数値分類マクロ FP_INFINITE FP_NAN FP_NORMAL FP_SUBNORMAL FP_ZERO。特に式の評価範囲が広いシステムでは、関数があらすじのプロトタイプが示すよりも広い形式の引数や戻り値を渡すことがある。float_t と double_t という型は、それぞれ少なくとも float と double と同じ幅を持つ、実装上最も効率的な型であることを意図しています。FLT_EVAL_METHOD が 0、1、または 2 の場合、 float_t 型は浮動式を評価するために実装が使用する最も狭い型です。HUGE_VAL、HUGE_VALF、および HUGE_VALL は、無限大をサポートする実装では正の無限大になります。HUGE_VAL、HUGE_VALF、HUGE_VALLは、無限大をサポートする実装では、正の無限大になることがあります。この場合、INFINITYを使用すると、6.4.4の制約に違反するため、診断が必要になります。これらは、異なる値を持つ整数定数式に展開されます。FP_ と大文字で始まるマクロ定義を持つ、実装で定義された追加の浮動小数点分類も、実装で指定することができます。
マクロFP_FAST_FMAはオプションで定義されます。定義されていると、fma関数は一般的にダブルオペランドの乗算や加算と同程度かそれ以上の速度で実行されることを示します。マクロ FP_FAST_FMAF FP_FAST_FMAL は、それぞれ FP_FAST_FMA の float および long double の類似品です。定義されている場合、これらのマクロは整数定数1に展開されます。
マクロFP_ILOGB0 FP_ILOGBNANは整数の定数式に展開され、xがゼロまたはNaNの場合はそれぞれilogb(x)によって値が返されます。FP_ILOGB0の値はINT_MINまたは-INT_MAXのいずれかです。FP_ILOGBNANの値は、INT_MAXまたはINT_MINのいずれかです。
9 マクロMATH_ERRNO MATH_ERREXCEPTは、それぞれ整数定数の1と2に展開され、マクロMATH_ERRANDLINGは、int型と値MATH_ERRNO、MATH_ERREXCEPT、または両者のビット和を持つ式に展開されます。math_errhandlingの値は、プログラムの期間中、一定です。math_errhandlingがマクロであるか、外部リンクを持つ識別子であるかは不詳である。マクロの定義が抑制されている場合や、プログラムがmath_errhandlingという名前の識別子を定義している場合、その動作は未定義です。式math_errhandling & MATH_ERREXCEPTが0でないことがある場合、実装ではにマクロFE_DIVBYZERO、FE_INVALID、FE_OVERFLOWを定義しなければならない。
----
----
最初に言及されていシノプシス( ''synopses'' )の存在が、を用意する動機づけになっています。
また、§7.12の頁註の「特に、広い範囲で式を評価するシステムでは、関数は、シノプシス・プロトタイプが示すよりも広いフォーマットで引数と戻り値を渡すかもしれません。」とあり、float, double, long double 以外の大きさと精度の実浮動小数点数型の実装を暗示させています。
エラー状態の扱い( ''Treatment of error conditions'' )について、ISO/IEC 9899:2018（通称 C18）の §7.12.1 ''Treatment of error conditions'' の冒頭を抄訳/引用します。
7.12.1 エラー条件の扱い
の各関数の動作は、他に記述されている場合を除き、その入力引数のすべての表現可能な値に対して指定される。各関数は、SIGFPEを上げることなく、また、関数の結果を反映させる以外の浮動小数点例外である "invalid"（無効演算）、"divide-by-zero"（セロ除算）、"overflow "（オーバーフロー）を発生させることなく、1つの操作であるかのように実行される。
すべての関数において、入力引数が数学関数が定義されている領域の外にある場合に限り、定義域エラー( ''domain error'' )が発生します。各関数の説明には、必要な定義域エラーが記載されています。実装では、関数の数学的定義と矛盾しない範囲で、追加の定義域エラーを定義することができます。定義域エラーが発生した場合、この関数は実装で定義された値を返します。通常、FP_FAST_FMAマクロは、fma関数がハードウェアの乗算加算命令で直接実装されている場合にのみ定義されます。ソフトウェアでの実装は大幅に遅くなることが予想されます。無限大をサポートしている実装では、関数の数学的定義域に無限大が含まれていない場合、引数としての無限大を定義域エラーとすることができます。 math_errhandling & MATH_ERRNO がゼロでない場合、整数式 errno は値 EDOM を取得します。整数式 math_errhandling & MATH_ERREXCEPT がゼロでない場合、浮動小数点例外「無効演算」が発生します。
同様に、ポール・エラー（''pole errors''; 特異点 ''singularity''、無限{的,性} ''infinitary'' とも呼ばれる）は、数学関数が有限の入力引数を極限に近づけたときに正確な無限大の結果を持つ場合にのみ発生します（例えば、log(0...)）。各関数の説明( ''description'' )には、必要なポール・エラーが記載されている。実装では、関数の数学的定義と矛盾しない範囲で、追加のポール・エラーを定義することができる。ポール・エラーが発生すると、この関数は実装で定義された値を返します。整数式 math_errhandling & MATH_ERRNO がゼロでない場合、整数式 errno は値 ERANGE を獲得します。整数式 math_errhandling & MATH_ERREXCEPT がゼロでない場合、浮動小数点例外「ゼロ除算」が発生します。
同様に、関数の数学的結果が極端に大きいために、指定された型のオブジェクトで表現できない場合に限り、値域エラー（range error）が発生します。各関数の説明には、必要な値域エラーが記載されています。実装では、追加の値域エラーを定義することができますが、そのようなエラーは関数の数学的定義と一致しており、オーバーフローまたはアンダーフローの結果となります。
浮動小数点の結果がオーバーフローするのは、数学的な結果の大きさが有限であるが、非常に大きいため、指定された型のオブジェクトで異常な丸め誤差なしに数学的な結果を表現できない場合です。浮動小数点数の結果がオーバーフローし、デフォルトの丸め処理が有効な場合、この関数は戻り値の型に応じてマクロ HUGE_VAL、HUGE_VALF、または HUGE_VALL の値を、関数の正しい値と同じ符号で返します。整数式 math_errhandling & MATH_ERRNO が 0 以外の場合、整数式 errno は値 ERANGE を取得します。整数式 math_errhandling & MATH_ERREXCEPT が 0 以外の場合、浮動小数点例外「オーバーフロー」が発生します。
結果がアンダーフローするのは、数学的な結果の大きさが非常に小さく、異常な丸め誤差なしに、指定された型のオブジェクトで数学的な結果を表すことができない場合です。整数式 math_errhandling & MATH_ERRNO が 0 以外の場合、errno が ERANGE を取得するかどうかは実装で定義されています。整数式 math_errhandling & MATH_ERREXCEPT が 0 以外の場合、浮動小数点例外「アンダーフロー」が発生するかどうかは実装で定義されています。
定義域、ポール、または値域エラーが発生し、整数式 math_errhandling & MATH_ERRNO がゼロの場合、errno はエラーに対応する値に設定されるか、または変更されないままになります。そのようなエラーが発生しなかった場合は、math_errhandlingの設定にかかわらず、errnoは変更されないままになります。
----
7.12.1 Treatment of error conditions
C99にはなかった、ポール・エラー（''pole errors''）への言及が追加されました。
形式 :
説明
FP_CONTRACTプラグマを使用すると、縮約式( ''contract expressions''; JISでは訳を式と短縮に分けているが contract expressions で成句 )の実装を許可（状態が「オン」の場合）または不許可（状態が「オフ」の場合）することができます。状態が''off''の場合）を許可したり、禁止したりすることができます（§6.5 Expressions）。各プラグマは、外部宣言の外側、または複合文の中のすべての明示的な宣言と文の前に置くことができます。外部宣言の外側にある場合、プラグマはその発生から他のFP_CONTRACTプラグマに出会うまで、または翻訳単位が終了するまで効力を発揮します。複合文の中では、そのプラグマは発生してから他のFP_CONTRACTプラグマが発生するまで（入れ子の複合文の中も含む）、または複合文が終了するまで有効になります。このプラグマを他の文脈で使用した場合、その動作は未定義です。プラグマのデフォルトの状態（''on''または''off''）は、実装で定義されます。
本節の形式では、実浮動小数点型( ''real-floating'' )は、引数が実浮動小数点型の式( ''an expression of real floating type'' )でなければならないことを示す。
形式 :
int fpclassify(real-floating x);
説明
fpclassifyマクロは、引数の値を、NaN、infinite、normal、subnormal、zero、その他の実装で定義されたカテゴリに分類します。まず、意味上の型よりも広い形式で表現された引数は、その意味上の型に変換されます。その後、引数のタイプに基づいて分類されます。
返却値
fpclassifyマクロは、引数の値に応じた数値分類マクロの値を返します。
形式 :
int isfinite(real-floating x);
説明
isfinite マクロは、引数が有限の値（ゼロ、サブノーマル、ノーマル、そして無限ではない、NaN）であるかどうかを判定します。まず、意味上の型よりも広い形式で表現された引数は、その意味上の型に変換される。その後、引数の型に基づいて判定を行う。
返却値
isfiniteマクロは、その引数が有限の値を持つ場合に限り、0でない値を返します。
形式 :
int isinf(real-floating x);
説明
isinf マクロは、引数の値が無限大かどうか（正か負か）を判定します。まず、意味上の型よりも広い形式で表現されている引数は、その意味上の型に変換されます。その後、引数の型に基づいて判定を行う。
返却値
isinfマクロは、その引数が無限大の値を持つ場合に限り、0ではない値を返します。
形式 :
int isnan(real-floating x);
238)Since an expression can be evaluated with more range and precision than its type has, it is important to know the type
that classification is based on. For example, a normal long double value might become subnormal when converted to
double, and zero when converted to float.
説明
返却値
形式 :
int isnormal(real-floating x);
説明
isnormal マクロは、引数の値が正常であるかどうか（0、subnormal、infinite、NaN のいずれでもないか）を判定します。まず、意味上の型よりも広い形式で表現された引数は、その意味上の型に変換される。その後、引数の型に基づいて判定を行う。
返却値
isnormal マクロは、その引数が正常値である場合に限り、非ゼロの値を返します。
形式 :
int signbit(real-floating x);
説明
signbitマクロは、引数の値の符号が負であるかどうかを判定します。
返却値
signbitマクロは、引数の値の符号が負の場合に限り、0以外の値を返します。
形式 :
double acos(double x);
float acosf(float x);
long double acosl(long double x);
説明
acos関数は、xのアークコサインの主値を計算します。引数が区間[-1, +1]にない場合、定義域エラーが発生します。
返却値
acos関数は、区間[0, π]ラジアンにおけるarccos xを返します。isnanマクロでは、実装が評価型ではなく意味型でNaNをサポートしない限り、判定のための型は重要ではありません。signbitマクロは、無限大、ゼロ、NaNを含むすべての値の符号を報告する。ゼロが符号なしの場合、それは正として扱われる。
形式 :
double asin(double x);
float asinf(float x);
long double asinl(long double x);
説明
asin関数は、xのアークサインの主値を計算します。引数が区間[-1, +1]にない場合、定義域エラーが発生します。
返却値
形式 :
double atan(double x);
float atanf(float x);
long double atanl(long double x);
説明
atan関数は、xのアークタンジェントの主値を計算します。
返却値
形式 :
double atan2(double y, double x);
float atan2f(float y, float x);
long double atan2l(long double y, long double x);
説明
atan2関数は、y/xのアークタンジェントの値を計算し、両方の引数の符号を使用して戻り値の象限を決定します。両方の引数がゼロの場合、定義域エラーが発生することがあります。
返却値
atan2関数は，区間[-π, +π]ラジアンのarctan y/xを返します。
形式 :
double cos(double x);
float cosf(float x);
long double cosl(long double x);
説明
cos関数は、xの余弦（ラジアン単位）を計算します。
返却値
cos関数はcos xを返します。
形式 :
double sin(double x);
float sinf(float x);
long double sinl(long double x);
説明
sin関数は、xのサイン（ラジアン単位）を計算します。
返却値
sin関数はsin xを返します。
形式 :
double tan(double x);
float tanf(float x);
long double tanl(long double x);
説明
tan関数は、xのタンジェント（ラジアン単位）を返します。
返却値
tan関数はtan xを返します。
形式 :
double acosh(double x);
float acoshf(float x);
long double acoshl(long double x);
説明
返却値
形式 :
double asinh(double x);
float asinhf(float x);
long double asinhl(long double x);
説明
返却値
形式 :
double atanh(double x);
float atanhf(float x);
long double atanhl(long double x);
説明
返却値
形式 :
double cosh(double x);
float coshf(float x);
long double coshl(long double x);
説明
返却値
形式 :
double sinh(double x);
float sinhf(float x);
long double sinhl(long double x);
説明
返却値
形式 :
double tanh(double x);
float tanhf(float x);
long double tanhl(long double x);
説明
返却値
形式 :
double exp(double x);
float expf(float x);
long double expl(long double x);
説明
返却値
. 
形式 :
double exp2(double x);
float exp2f(float x);
long double exp2l(long double x);
説明
返却値
. 
形式 :
double expm1(double x);
float expm1f(float x);
long double expm1l(long double x);
説明
返却値
形式 :
double frexp(double value, int *exp);
float frexpf(float value, int *exp);
long double frexpl(long double value, int *exp);
241)For small magnitude x, expm1(x) is expected to be more accurate than exp(x)-1.
説明
返却値
形式 :
int ilogb(double x);
int ilogbf(float x);
int ilogbl(long double x);
説明
返却値
Forward references: the logb functions (7.12.6.11).
形式 :
double ldexp(double x, int exp);
float ldexpf(float x, int exp);
long double ldexpl(long double x, int exp);
説明
返却値
形式 :
double log(double x);
float logf(float x);
long double logl(long double x);
説明
返却値
形式 :
double log10(double x);
float log10f(float x);
long double log10l(long double x);
説明
返却値
形式 :
double log1p(double x);
float log1pf(float x);
long double log1pl(long double x);
説明
返却値
形式 :
double log2(double x);
float log2f(float x);
long double log2l(long double x);
説明
返却値
形式 :
double logb(double x);
float logbf(float x);
long double logbl(long double x);
242)For small magnitude x, log1p(x) is expected to be more accurate than log(1 + x).
説明
返却値
形式 :
double modf(double value, double *iptr);
float modff(float value, float *iptr);
long double modfl(long double value, long double *iptr);
説明
返却値
形式 :
double scalbn(double x, int n);
float scalbnf(float x, int n);
long double scalbnl(long double x, int n);
double scalbln(double x, long int n);
float scalblnf(float x, long int n);
long double scalblnl(long double x, long int n);
説明
返却値
形式 :
double cbrt(double x);
float cbrtf(float x);
long double cbrtl(long double x);
説明
返却値
形式 :
double fabs(double x);
float fabsf(float x);
long double fabsl(long double x);
説明
返却値
形式 :
double hypot(double x, double y);
float hypotf(float x, float y);
long double hypotl(long double x, long double y);
説明
返却値
形式 :
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);
説明
返却値
形式 :
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);
説明
返却値
形式 :
double erf(double x);
float erff(float x);
long double erfl(long double x);
説明
返却値
形式 :
double erfc(double x);
float erfcf(float x);
long double erfcl(long double x);
説明
返却値
形式 :
double lgamma(double x);
float lgammaf(float x);
long double lgammal(long double x);
説明
返却値
形式 :
double tgamma(double x);
float tgammaf(float x);
long double tgammal(long double x);
説明
返却値
形式 :
double ceil(double x);
float ceilf(float x);
long double ceill(long double x);
説明
返却値
形式 :
double floor(double x);
float floorf(float x);
long double floorl(long double x);
説明
返却値
形式 :
double nearbyint(double x);
float nearbyintf(float x);
long double nearbyintl(long double x);
説明
返却値
形式 :
double rint(double x);
float rintf(float x);
long double rintl(long double x);
説明
返却値
形式 :
long int lrint(double x);
long int lrintf(float x);
long int lrintl(long double x);
long long int llrint(double x);
long long int llrintf(float x);
long long int llrintl(long double x);
説明
返却値
形式 :
double round(double x);
float roundf(float x);
long double roundl(long double x);
説明
返却値
形式 :
long int lround(double x);
long int lroundf(float x);
long int lroundl(long double x);
long long int llround(double x);
long long int llroundf(float x);
long long int llroundl(long double x);
説明
返却値
形式 :
double trunc(double x);
float truncf(float x);
long double truncl(long double x);
説明
返却値
形式 :
double fmod(double x, double y);
float fmodf(float x, float y);
long double fmodl(long double x, long double y);
説明
返却値
形式 :
double remainder(double x, double y);
float remainderf(float x, float y);
long double remainderl(long double x, long double y);
説明
返却値
形式 :
double remquo(double x, double y, int *quo);
float remquof(float x, float y, int *quo);
long double remquol(long double x, long double y,
int *quo);
説明
返却値
形式 :
double copysign(double x, double y);
float copysignf(float x, float y);
long double copysignl(long double x, long double y);
説明
返却値
形式 :
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
説明
返却値
Forward references: the strtod, strtof, and strtold functions (7.22.1.3).
形式 :
double nextafter(double x, double y);
float nextafterf(float x, float y);
long double nextafterl(long double x, long double y);
説明
返却値
形式 :
double nexttoward(double x, long double y);
float nexttowardf(float x, long double y);
long double nexttowardl(long double x, long double y);
説明
形式 :
double fdim(double x, double y);
float fdimf(float x, float y);
long double fdiml(long double x, long double y);
説明
返却値
形式 :
double fmax(double x, double y);
float fmaxf(float x, float y);
long double fmaxl(long double x, long double y);
説明
返却値
形式 :
double fmin(double x, double y);
float fminf(float x, float y);
long double fminl(long double x, long double y);
説明
返却値
形式 :
double fma(double x, double y, double z);
float fmaf(float x, float y, float z);
long double fmal(long double x, long double y, long double z);
説明
返却値
関係演算子と等式演算子は、数値の間の通常の数学的関係をサポートします。数値の順序付けられたペアでは、less、greater、equalのいずれかの関係が正確に真となります。関係演算子は、引数の値がNaNの場合、「invalid」という浮動小数点例外を発生させることがあります。以下のサブクラウ スでは、関係演算子の静かな（浮動小数点例外を発生させない）バージョンのマクロや、 「invalid」浮動小数点例外を発生させずに NaN を考慮する効率的なコードを書きやすくする他の比較マクロを提供します。本節の概要では、real-floating は、引数が実数浮動小数点型の式でなければならないことを示している。両方の引数が同じ型である必要はない。
形式 :
int isgreater(real-floating x, real-floating y);
説明
返却値
形式 :
int isgreaterequal(real-floating x, real-floating y);
説明
返却値
形式 :
int isless(real-floating x, real-floating y);
説明
raise the “invalid” floating-point exception when x and y are unordered. -->
返却値
形式 :
int islessequal(real-floating x, real-floating y);
説明
返却値
形式 :
int islessgreater(real-floating x, real-floating y);
説明
返却値
形式 :
int isunordered(real-floating x, real-floating y);
説明
返却値