C 库宏 - ERANGE

C 标准库 - <errno.h> C 标准库 - <errno.h>

描述

C 库宏 ERANGE 表示一个范围错误,它在输入参数超出数学函数定义的范围时发生,errno 被设置为 ERANGE。

ERANGE 是 C 标准库中的一个宏,定义在 <errno.h> 头文件中。它用于表示结果超出函数定义范围的错误,通常发生在数学函数和转换函数的计算结果超出可表示的范围时。

声明

下面是 ERANGE 宏的声明。

#define ERANGE some_value

参数

  • NA

返回值

  • NA

实例

以下是几个使用 ERANGE 的示例,演示如何处理结果超出范围的错误。

数学函数

在数学计算中,如 explog 函数,可能会发生 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("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

转换函数

在数值转换中,如 strtolstrtod 函数,如果转换结果超出目标类型的范围,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 = 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

使用注意事项

  1. 检查返回值:在调用可能产生范围错误的函数后,应检查返回值,通常这些函数在发生错误时返回特殊值(如 HUGE_VALHUGE_VALFHUGE_VALL0)。
  2. 初始化 errno:在调用函数前应将 errno 设置为 0,以确保错误码是由本次调用产生的,而不是之前的调用遗留的。
  3. 处理范围错误:当检测到 ERANGE 错误时,应该根据上下文适当处理,例如打印错误消息、使用替代值或重新尝试计算。

相关函数和错误码

  • 数学函数:如 exp, log, pow, sin, cos, tan,它们在计算结果超出表示范围时,可能会设置 errnoERANGE
  • 转换函数:如 strtol, strtoll, strtoul, strtoull, strtof, strtod, strtold,它们在转换结果超出表示范围时,可能会设置 errnoERANGE

其他相关错误码

  • EDOM:表示数学函数的参数域错误,即参数超出了定义域。
  • EILSEQ:表示非法字节序列错误,通常在处理多字节字符或宽字符时发生。

通过合理使用 errnoERANGE 及其相关函数,可以编写出更为健壮和可靠的代码,确保在各种异常情况下程序仍能正常处理和响应。

C 标准库 - <errno.h> C 标准库 - <errno.h>