libmvec(3M)

名前
libmvec - ベクトル版基本数学関数

形式

cc [ flag ... ] file ... -lmvec [ library ... ]

または

cc [ flag ... ] file ... -lmvec_mt [ library ... ]

void vatan_(int *n, double *x, int *stridex, double *y, int *stridey);

void vatan2_(int *n, double *y, int *stridey, double *x, int *stridex, double *z, int *stridez);

void vcos_(int *n, double *x, int *stridex, double *y, int *stridey);

void vexp_(int *n, double *x, int *stridex, double *y, int *stridey);

void vhypot_(int *n, double *x, int *stridex, double *y, int *stridey, double *z, int *stridez);

void vlog_(int *n, double *x, int *stridex, double *y, int *stridey);

void vpow_(int *n, double *x, int *stridex, double *y, int *stridey, double *z, int *stridez);

void vrhypot_(int *n, double *x, int *stridex, double *y, int *stridey, double *z, int *stridez);

void vrsqrt_(int *n, double *x, int *stridex, double *y, int *stridey);

void vsin_(int *n, double *x, int *stridex, double *y, int *stridey);

void vsincos_(int *n, double *x, int *stridex, double *s, int *strides, double *c, int *stridec);

void vsqrt_(int *n, double *x, int *stridex, double *y, int *stridey);

void vatanf_(int *n, float *x, int *stridex, float *y, int *stridey);

void vatan2f_(int *n, float *y, int *stridey, float *x, int *stridex, float *z, int *stridez);

void vcosf_(int *n, float *x, int *stridex, float *y, int *stridey);

void vexpf_(int *n, float *x, int *stridex, float *y, int *stridey);

void vhypotf_(int *n, float *x, int *stridex, float *y, int *stridey, float *z, int *stridez);

void vlogf_(int *n, float *x, int *stridex, float *y, int *stridey);

void vpowf_(int *n, float *x, int *stridex, float *y, int *stridey, float *z, int *stridez);

void vrhypotf_(int *n, float *x, int *stridex, float *y, int *stridey, float *z, int *stridez);

void vrsqrtf_(int *n, float *x, int *stridex, float *y, int *stridey);

void vsinf_(int *n, float *x, int *stridex, float *y, int *stridey);

void vsincosf_(int *n, float *x, int *stridex, float *s, int *strides, float *c, int *stridec);

void vsqrtf_(int *n, float *x, int *stridex, float *y, int *stridey);

機能説明

これらのルーチンは、値のベクトル全体に対して同時に、共通基本関数を 評価します。最初のパラメータは計算する値の数を示します。後続の パラメータは引数ベクトルと結果ベクトルを指定します。各ベクトルは、 最初の要素と刻み幅 (連続する要素間の増分) へのポインタで記述されます。 以下の説明では簡潔にするために、*stridex は sx と表記します。 *stridey や *stridez なども同様です。

vatan_(n, x, stridex, y, stridey) は、i = 0, 1, ..., *n - 1 のそれぞれに対して、 y[i*sy] = atan(x[i*sx]) を計算します。vcos_、vexp_、vlog_、 vsin_、および vsqrt_ にも同様な説明が適用されます。

vatan2_(n, y, stridey, x, stridex, z, stridez) は、両方の引数の符号を使用して、 z[i*sz] = atan(y[i*sy] / x[i*sx]) を計算し、結果の角度が存在する 四分円を求めます。

vhypot_(n, x, stridex, y, stridey, z, stridez) は z[i*sz] = sqrt( x[i*sx]**2 + y[i*sy]**2) を計算します。

vrhypot_(n, x, stridex, y, stridey, z, stridez) は z[i*sz] = 1 / sqrt(x[i*sx]**2 + y[i*sy]**2) を計算します。

vpow_(n, x, stridex, y, stridey, z, stridez) は z[i*sz] = x[i*sx]**y[i*sy] を計算します。 つまり、x[i*sx] を y[i*sy] 乗します。

vrsqrt_(n, x, stridex, y, stridey) は、i = 0, 1, ..., *n - 1 のそれぞれに対して、 y[i*sy] = 1 / sqrt(x[i*sx]) を計算します。

vsincos_(n, x, stridex, s, strides, c, stridec)は s[i*ss] = sin(x[i*sx]) と c[i*sc] = cos(x[i*sx]) を同時に計算します。

関数 vatanf_、 vatan2f_、vcosf_、 vexpf_、 vhypotf_、 vlogf_、 vpowf_、 vrhypotf_、vrsqrtf_、 vsinf_、vsincosf_ および vsqrtf_ は、上記の倍精度関数の単精度版です。

各関数において、要素数 *n はゼロより大きくなければなりません。 引数配列と結果配列に対する刻み幅は任意の整数です。 しかし、配列自身の一部またはすべてが重複してはなりません。たとえば、 次のコードの結果は正しくありません。

    	double x[100];
    	int n = 100, s = 1;
    	/*...*/
    	vexp_(&n, x, &s, x, &s);

刻み幅にはゼロも指定できることに注意してください。この場合、 ベクトル全体が単一の要素に効果的に縮小されます。したがって、 たとえば、vpow__ を使用して、y の値を固定し、 *stridey をゼロに設定して、 x[i]**y の値を計算できます。最後に、刻み幅 には負の値も指定できることに 注意してください。ただし、対応するポインタは使用されるベクトルの 最初の要素を参照する必要があります。刻み幅が負の場合、これは メモリー内で最も高いアドレスの要素になります (この規約は Level 1 BLAS とは異なります。Level 1 BLAS では、負の増分を使用する場合でも、 配列パラメータは常に、メモリー内で最も低いアドレスの要素を参照します)。

属性
次の属性については、 attributes(5) を参照してください。

属性タイプ | 属性値
使用条件 | SPROlang
インタフェース安定性 | 開発中
MT レベル | MT-安全

関連項目
atan(3M) 、 atan2(3M) 、 clibmvec(3M) 、 cos(3M) 、 exp(3M) 、 hypot(3M) 、 log(3M) 、 pow(3M) 、 sin(3M) 、 trig_sun(3M) 、 attributes(5)

診断

ベクトル関数は、例外を IEEE 754 の考え方で 扱い、-xlibmieee オプションが指定されたときの対応する Fortran および C のスカラー関数と本質的には同じ結果を作成します。 (例外時の動作については、 スカラー関数のマニュアルページを参照してください)。引数配列の すべての要素が数値的に正確な結果を導くような場合でも、 いくつかのベクトル関数は不正確な例外を引き起こすことがあります。

注意事項
上記ベクトル関数は、2 つのライブラリ libmvec.a と libmvec_mt.a で 提供されます。後者には、コンパイラが提供する自動並列化と連結して 動作する、並列化バージョンの関数が入っています。libmvec_mt.a を 使用するには、並列化オプション -xparallel、-xexplicitpar、 または -xautopar の 1 つとリンクしなければなりません。

このライブラリ内の関数を呼び出すときは、自分でデフォルトの round-to-nearest モードを有効にする必要があります。 ベクトル関数は、デフォルトの round-to-nearest モードである ことを前提にしています。 呼び出し元のプログラムが丸めモードをデフォルト以外のモード に変更している場合は、ベクトル関数を呼び出す前に、 round-to-nearest モードに再設定する必要があります。 デフォルト以外の丸めモードでベクトル関数を呼び出したときの 結果は定義されていません。

-xvector=yesか -xlibmopt、 -fast のどれかを使い、間接的にベクトル関数を呼び出すことができます。 -fast コンパイルオプションは、プログラムがデフォルトの丸めモード のみ使用することを宣言します。このため丸めモードを変更しては いけません。 -xlibmopt および -xvector=yesの場合は、 プログラムから数学関数を呼び出すとき、必ず、丸めモードを デフォルトの round-to-nearest に設定する必要があります。 デフォルト以外の丸めモードは、数学ライブラリの外部の算術 関数に使用できます。

ベクトルおよび並列実行では、要素は x[0]、x[1*sx]、 x[2*sx]、などの順序で評価する必要はありません。 そのため、発生する例外も順序通りになるとは限りません。たとえば、 引数 exp(x[1]) でオーバーフロー例外が発生し、 また exp(x[9]) で無効な演算例外が発生する場合は、 vexp_ の呼び出しでオーバーフローが 最初に発生する保証はありません。

ベクトル関数 vsqrt_ および vsqrtf_ は、そのスカラー関数と 違って、結果の丸め値が正確ではない可能性があります。しかし、各結果の エラーは、最後の桁の 1 単位未満です。

Solaris 10 では、libmvec.a の共有ライブラリ版、libmvec.so が あります。libmvec.so と明示的にリンクするには、-lmvec ではなく、その完全 パス名を使用します。これは、32 ビットモードでは、 /usr/lib/libmvec.so、 64 ビットモードでは、 /usr/lib/64/libmvec.so です。