Cライブラリマクロ -EDOM
説明
CライブラリマクロEDOMドメインエラーを表し、入力引数が数学関数で定義された定義域を超えたときに発生し、errnoがEDOMに設定されます。
EDOMはC標準ライブラリ内のマクロで、<errno.h>ヘッダーファイル内に定義されています。これは数学関数の引数ドメインエラー(引数が数学的な定義域を超えている)を表すために使用されます。これは通常、数学ライブラリ関数(例:sqrt、log、asinなど)が無効な入力引数を受け取ったときに発生します。
宣言
以下は、EDOMを使用した例で、数学関数の引数ドメインエラーを処理する方法を示しています:
#define EDOM some_value
パラメータ
- NA
戻り値
- NA
例
以下の例は、EDOMマクロの使用方法を示しています。
例
#include <stdio.h>
#include <math.h>
#include <errno.h>
int main() {
double x = -1.0;
double result;
// 以前のエラーをクリア
errno = 0;
// sqrt関数を呼び出し、負の値を渡すとドメインエラーが発生する
result = sqrt(x);
if (errno == EDOM) {
printf("Error: sqrt() domain error, input value is %f\n", x);
} else {
printf("The square root of %f is %f\n", x, result);
}
return 0;
}
#include <math.h>
#include <errno.h>
int main() {
double x = -1.0;
double result;
// 以前のエラーをクリア
errno = 0;
// sqrt関数を呼び出し、負の値を渡すとドメインエラーが発生する
result = sqrt(x);
if (errno == EDOM) {
printf("Error: sqrt() domain error, input value is %f\n", x);
} else {
printf("The square root of %f is %f\n", x, result);
}
return 0;
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます:
The square root of -1.000000 is nan
この例では:
- ここでは -1 の平方根を計算しようとしています。これは定義域を超える操作です。負の数には実数の平方根がないためです。
sqrt関数はこのドメインエラーを検出し、errnoに設定します。EDOM。- 私たちは確認します
errnoの値を、もしそれがEDOMならば、対応するエラーメッセージを出力します。
関連する数学関数
以下は、設定する可能性があるerrnoためにEDOM数学関数です:
sqrt(x):もしx < 0ならば、設定されますerrnoためにEDOM。log(x):もしx <= 0ならば、設定されますerrnoためにEDOM。asin(x)とacos(x):もしxが[-1, 1]の範囲にない場合は、設定されますerrnoためにEDOM。pow(x, y):もしx < 0且yが整数でない場合は、設定されますerrnoためにEDOM。
使用上の注意
- 戻り値を確認する:ドメインエラーを発生させる可能性のある数学関数を呼び出した後、戻り値を確認し、関数が特別な値(例:
NaN)を返した場合にerrno。 - 初期化
errno:関数を呼び出す前に、errnoを0に設定してください。これにより、エラーコードが今回の呼び出しによるものであり、以前の呼び出しによるものではないことを確認できます。 - スレッドセーフ:マルチスレッドプログラムでは、
errnoは通常、スレッドローカルストレージ(Thread-Local Storage, TLS)として実装され、各スレッドが独立したerrno値を持つことを保証します。
その他の関連エラーコード
以外にも、EDOM,<errno.h>には、数学関数に関連する他のエラーコードがあります:
ERANGE:結果が範囲外です。例えば、計算exp(1000)はオーバーフローを引き起こす可能性があり、errnoを設定しますERANGE。EILSEQ:不正なバイトシーケンスです。ワイド文字またはマルチバイト文字関数を処理する際、入力データに無効な文字シーケンスが含まれています。
要するに、EDOMは、数学関数の引数ドメインエラーを処理するための重要なマクロであり、プログラマーが無効な入力引数を検出して処理するのに役立ちます。errnoEDOMとその関連マクロを適切に使用することで、より堅牢で信頼性の高いコードを作成できます。
C標準ライブラリ - <errno.h>