Макрос библиотеки C -ERANGE
Стандартная библиотека C - <errno.h>
Описание
Макрос библиотеки CERANGEУказывает на ошибку диапазона, которая возникает, когда входной аргумент превышает диапазон, определённый математической функцией, и errno устанавливается в ERANGE.
ERANGE— это макрос в стандартной библиотеке C, определённый в<errno.h>в заголовочном файле. Он используется для указания на ошибку, при которой результат превышает диапазон, определённый функцией; обычно это происходит, когда результат математической функции или функции преобразования превышает представимый диапазон.
Объявление
Ниже приведено объявление макроса ERANGE.
#define ERANGE some_value
Параметр
- Н/Д
Возвращаемое значение
- Н/Д
Пример
Ниже приведены несколько примеров использования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("Ошибка: результат exp() выходит за пределы диапазона для входного значения %f\n", x);
} else {
printf("Экспонента от %f равна %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 за пределы диапазона
result = strtol(str, NULL, 10);
if (errno == ERANGE) {
printf("Ошибка: результат strtol() вне допустимого диапазона для входной строки %s\n", str);
} else {
printf("Преобразованное значение типа long равно %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и связанных с ним функций вы можете писать более надёжный и стабильный код, гарантируя, что программа сможет корректно обрабатывать и реагировать в различных аномальных условиях.