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
及其相关宏,可以编写出更为健壮和可靠的代码。
点我分享笔记