Cライブラリマクロ -ERANGE
説明
CライブラリマクロERANGE範囲エラーを表し、入力引数が数学関数の定義範囲を超えると発生します。このとき errno が ERANGE に設定されます。
ERANGEC標準ライブラリのマクロであり、定義されているのは<errno.h>ヘッダーファイル内です。これは、結果が関数の定義範囲を超えたことを示すエラーを表し、通常は数学関数や変換関数の計算結果が表現可能な範囲を超えたときに発生します。
宣言
以下は ERANGE マクロの宣言です。
#define ERANGE some_value
引数
- NA
戻り値
- NA
例
以下は、いくつかの使用ERANGEの例で、結果が範囲を超えたエラーの処理方法を示しています。
数学関数
数学計算では、例えばexp 或 log関数で、発生する可能性がありますERANGEエラー。例えば、非常に大きな指数を計算する場合、結果が浮動小数点数の表現範囲を超える可能性があります。
例
#include <math.h>
#include <errno.h>
int main() {
double x = 1000.0;
double result;
// 以前のエラーをクリア
errno = 0;
// exp 関数を呼び出すと、結果が範囲を超える可能性がある
result = exp(x);
if (errno == ERANGE) {
printf("Error: exp() result out of range for input value %f\n", x);
} else {
printf("The exp of %f is %f\n", x, result);
}
return 0;
}
この例では、計算exp(1000.0)結果が範囲を超える可能性があり、そのときerrnoが設定されますERANGE。
上記のプログラムをコンパイルして実行してみましょう。次の結果が得られます。
The exp of 1000.000000 is inf
変換関数
数値変換では、例えばstrtol 或 strtod関数では、変換結果がターゲット型の範囲を超えた場合、errnoも設定されますERANGE。
例
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
int main() {
const char *str = "99999999999999999999999999";
long result;
// 以前のエラーをクリア
errno = 0;
// strtol 関数を呼び出すと、結果が範囲を超える可能性がある
result = strtol(str, NULL, 10);
if (errno == ERANGE) {
printf("Error: strtol() result out of range for input string %s\n", str);
} else {
printf("The converted long value is %ld\n", result);
}
return 0;
}
この例では、文字列"99999999999999999999999999"を変換すると、long型の数値になったとき、結果がlongの表現範囲を超え、errnoに設定されます。ERANGE。
上記のプログラムをコンパイルして実行してみましょう。次の結果が得られます。
Error: strtol() result out of range for input string 99999999999999999999999999
使用上の注意
- 戻り値を確認する:範囲エラーを引き起こす可能性のある関数を呼び出した後は、戻り値を確認する必要があります。通常、これらの関数はエラー発生時に特別な値を返します(例えば
HUGE_VAL、HUGE_VALF、HUGE_VALL或0)。 - 初期化
errno:関数を呼び出す前に、errnoを 0 に設定し、エラーコードが今回の呼び出しで発生したものであり、以前の呼び出しから残ったものではないことを確認します。 - 範囲エラーの処理:もし
ERANGEエラーを検出した場合は、状況に応じて適切に処理する必要があります。例えば、エラーメッセージを出力する、代替値を使用する、計算を再試行するなどです。
関連関数とエラーコード
- 数学関数:例えば
exp,log,pow,sin,cos,tanは、計算結果が表現範囲を超えた場合に、設定される可能性があります。errnoためにERANGE。 - 変換関数:例えば
strtol,strtoll,strtoul,strtoull,strtof,strtod,strtoldは、変換結果が表現範囲を超えた場合に、設定される可能性があります。errnoためにERANGE。
その他の関連エラーコード
EDOM:数学関数の定義域エラーを表します。つまり、引数が定義域を超えています。EILSEQ:不正なバイト列エラーを表します。通常、マルチバイト文字やワイド文字を処理するときに発生します。
合理的に使用すること、errno、ERANGEおよびその関連関数を活用することで、より堅牢で信頼性の高いコードを作成でき、さまざまな異常な状況でもプログラムが正常に処理および応答できることを保証します。
C標準ライブラリ - <errno.h>