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 是一个重要的宏,用于处理数学函数的参数域错误,帮助程序员检测和处理非法输入参数。通过合理使用 errno 及其相关宏,可以编写出更为健壮和可靠的代码。
C 标准库 - <errno.h>
点我分享笔记