Макрос библиотеки C -ERANGE

Стандартная библиотека C - <errno.h>

Описание

Макрос библиотеки CERANGEУказывает на ошибку диапазона, которая возникает, когда входной аргумент превышает диапазон, определённый математической функцией, и errno устанавливается в ERANGE.

ERANGE— это макрос в стандартной библиотеке C, определённый в<errno.h>в заголовочном файле. Он используется для указания на ошибку, при которой результат превышает диапазон, определённый функцией; обычно это происходит, когда результат математической функции или функции преобразования превышает представимый диапазон.

Объявление

Ниже приведено объявление макроса ERANGE.

#define ERANGE some_value

Параметр

  • Н/Д

Возвращаемое значение

  • Н/Д

Пример

Ниже приведены несколько примеров использованияERANGEпример, демонстрирующий, как обрабатывать ошибку выхода результата за пределы диапазона.

Математические функции

В математических вычислениях, таких какexpилиlog-функция, может возникнуть ошибка.ERANGEошибка. Например, при вычислении очень большой экспоненты результат может превысить представимый диапазон чисел с плавающей запятой.

Пример

#include <stdio.h>
#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 <stdio.h>
#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

Меры предосторожности при использовании

  1. Проверяйте возвращаемое значение: После вызова функции, которая может вызвать ошибку диапазона, следует проверять возвращаемое значение. Обычно такие функции возвращают специальное значение при ошибке (например,HUGE_VAL、HUGE_VALF、HUGE_VALLили0)。
  2. Инициализацияerrno: перед вызовом функции следуетerrnoустановлено в 0, чтобы гарантировать, что код ошибки был получен в результате этого вызова, а не остался от предыдущего вызова.
  3. Обработка ошибок диапазона: при обнаружении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>

Другие расширения