マニュアルページ libmvec.3m
名前
libmvec - ベクトル版基本数学関数
形式
cc [ flag ... ] file ... -lmvec [ library ... ]
または
cc [ flag ... ] file ... -lmvec_mt [ library ... ]
void vatan_(int *n, double * restrict x, int *stridex, dou-
ble * restrict y, int *stridey);
void vatan2_(int *n, double * restrict y, int *stridey, dou-
ble * restrict x, int *stridex, double * restrict z, int
*stridez);
void vcos_(int *n, double * restrict x, int *stridex, double
* restrict y, int *stridey);
void vexp_(int *n, double * restrict x, int *stridex, double
* restrict y, int *stridey);
void vhypot_(int *n, double * restrict x, int *stridex, dou-
ble * restrict y, int *stridey, double * restrict z, int
*stridez);
void vlog_(int *n, double * restrict x, int *stridex, double
* restrict y, int *stridey);
void vpow_(int *n, double * restrict x, int *stridex, double
* restrict y, int *stridey, double * restrict z, int *stri-
dez);
void vrhypot_(int *n, double * restrict x, int *stridex,
double * restrict y, int *stridey, double * restrict z, int
*stridez);
void vrsqrt_(int *n, double * restrict x, int *stridex, dou-
ble * restrict y, int *stridey);
void vsin_(int *n, double * restrict x, int *stridex, double
* restrict y, int *stridey);
void vsincos_(int *n, double * restrict x, int *stridex,
double * restrict s, int *strides, double * restrict c, int
*stridec);
void vsqrt_(int *n, double * restrict x, int *stridex, dou-
ble * restrict y, int *stridey);
void vatanf_(int *n, float * restrict x, int *stridex, float
* restrict y, int *stridey);
void vatan2f_(int *n, float * restrict y, int *stridey,
float * restrict x, int *stridex, float * restrict z, int
*stridez);
void vcosf_(int *n, float * restrict x, int *stridex, float
* restrict y, int *stridey);
void vexpf_(int *n, float * restrict x, int *stridex, float
* restrict y, int *stridey);
void vhypotf_(int *n, float * restrict x, int *stridex,
float * restrict y, int *stridey, float * restrict z, int
*stridez);
void vlogf_(int *n, float * restrict x, int *stridex, float
* restrict y, int *stridey);
void vpowf_(int *n, float * restrict x, int *stridex, float
* restrict y, int *stridey, float * restrict z, int *stri-
dez);
void vrhypotf_(int *n, float * restrict x, int *stridex,
float * restrict y, int *stridey, float * restrict z, int
*stridez);
void vrsqrtf_(int *n, float * restrict x, int *stridex,
float * restrict y, int *stridey);
void vsinf_(int *n, float * restrict x, int *stridex, float
* restrict y, int *stridey);
void vsincosf_(int *n, float * restrict x, int *stridex,
float * restrict s, int *strides, float * restrict c, int
*stridec);
void vsqrtf_(int *n, float * restrict x, int *stridex, float
* restrict 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、 -fast のいずれかを使い、間接的にベクトル関 数
を 呼び出すことができます。 -fast コンパイルオプションは、プ
ログラムがデフォルトの丸めモードのみ使用することを宣言 し ま
す。このため丸めモードを変更してはいけません。 -xvector=yes
コンパイラオプションを使用すると、標準数学ライブラリの ス カ
ラー関数に対する呼び出しを、対応するベクトル関数の呼び出しに
置き換えることができます。このため、このオプションを使用する
ときは、数学関数が呼び出されるとき、必ず最近似値に丸めモード
が有効になっているようにする必要があります。
ベクトルおよび並列実行では、要素は 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 です。