インテルの算術ライブラリーの使用

インテルの算術ライブラリーを使用するには、プログラムに、ヘッダーファイル mathimf.h をインクルードしてください。下記に、算術ライブラリーを使用した 2 つのプログラム例を示します。

実関数の使用例

// real_math.c

 

#include <stdio.h>

#include <mathimf.h>

 

int main() {

 

float  fp32bits;

double fp64bits;

long double fp80bits;

long double pi_by_four = 3.141592653589793238/4.0;

 

// pi/4 radians is about 45 degrees.

 

fp32bits = (float) pi_by_four;   // float approximation to pi/4

fp64bits = (double) pi_by_four;  // double approximation to pi/4

fp80bits = pi_by_four;           // long double (extended) approximation to pi/4

 

// The sin(pi/4) is known to be 1/sqrt(2) or approximately .7071067

 

printf("When x = %8.8f, sinf(x) = %8.8f \n", fp32bits, sinf(fp32bits));

printf("When x = %16.16f, sin(x) = %16.16f \n", fp64bits, sin(fp64bits));

printf("When x = %20.20Lf, sinl(x) = %20.20f \n", fp80bits, sinl(fp80bits));

 

return 0;

}

real_math.c のコンパイル:

prompt>icc real_math.c

a.out の出力は次のようになります。

When x = 0.78539816, sinf(x) = 0.70710678

When x = 0.7853981633974483, sin(x) = 0.7071067811865475

When x = 0.78539816339744827900, sinl(x) = 0.70710678118654750275

複素関数の使用例

// complex_math.c

 

#include <stdio.h>

#include <complex.h>

 

int main()

{

 

float  _Complex c32in,c32out;

double _Complex c64in,c64out;

double pi_by_four= 3.141592653589793238/4.0;

 

c64in = 1.0 + I* pi_by_four;

 

// Create the double precision complex number 1 + (pi/4) * i

// where I is the imaginary unit.

 

c32in = (float _Complex) c64in;

 

// Create the float complex value from the double complex value.

 

c64out = cexp(c64in);

c32out = cexpf(c32in);

 

// Call the complex exponential,

// cexp(z) = cexp(x+iy) = e^ (x + i y) = e^x * (cos(y) + i sin(y))

 

printf("When z = %7.7f + %7.7f i, cexpf(z) = %7.7f + %7.7f i \n"

,crealf(c32in),cimagf(c32in),crealf(c32out),cimagf(c32out));

printf("When z = %12.12f + %12.12f i, cexp(z) = %12.12f + %12.12f i \n"

,creal(c64in),cimag(c64in),creal(c64out),cimagf(c64out));

 

return 0;

}

prompt>icc -std=c99 complex_math.c

a.out の出力は次のようになります。

When z = 1.0000000 + 0.7853982 i, cexpf(z) = 1.9221154 + 1.9221156 i

When z = 1.000000000000 + 0.785398163397 i, cexp(z) = 1.922115514080 + 1.922115514080 i

_Complex データ型は、C プログラムではサポートされていますが、C++ プログラムではサポートされていません。

例外条件

未定義の結果になる引数を使用して算術関数を呼び出した場合、エラー番号がシステム変数 errno に割り当てられます。算術関数エラーは通常、領域エラーまたは範囲エラーです。

領域エラーは、関数で領域外の引数が使用された場合に発生します。例えば、acos の引数は -1 から +1 の間のみと定義されています。このため、acos(-2)acos(3) を評価すると、領域エラーが発生し、戻り値は QNaN になります。

範囲エラーは、数学上は有効な引数を使用して、関数の値が浮動小数点データ型で表現可能な値の範囲を超えた場合に発生します。例えば、exp(1000) を評価すると、範囲エラーが発生し、戻り値は INF になります。

領域または範囲エラーが発生すると、次の値が errno に割り当てられます。

次の例は、EDOM および ERANGE エラーの errno の読み方を示したものです。

// errno.c

 

#include <errno.h>

#include <mathimf.h>

#include <stdio.h>

 

int main(void)

{   

   double neg_one=-1.0;

   double zero=0.0;   

 

   // The natural log of a negative number is considered a domain error - EDOM

   printf("log(%e) = %e and errno(EDOM) = %d \n",neg_one,log(neg_one),errno);   

 

   // The natural log of zero is considered a range error - ERANGE

   printf("log(%e) = %e and errno(ERANGE) = %d \n",zero,log(zero),errno);

}

errno.c の出力は次のようになります。

log(-1.000000e+00) = nan and errno(EDOM) = 33

log(0.000000e+00) = -inf and errno(ERANGE) = 34

このセクションの算術関数では、適用可能な場合、errno の対応する値が表示されます。

その他の考慮事項

コンパイラーによって、自動的にインライン化される算術関数もあります。実際にインライン化される関数は、使用するベクトル化またはプロセッサー固有のコンパイラー・オプションに依存し、異なります。詳細は、「関数のインライン展開の条件」を参照してください。

デフォルトの精度制御または丸めモードを変更すると、いくつかの算術関数で返される結果に影響する場合があります。「浮動小数点演算の精度」を参照してください。

_Complexデータ型を使用するプログラムをコンパイルする場合は、-std=c99 コンパイラー・オプションをインクルードする必要があります。