Windows中sqrt()函数的域错误未将errno设置为EDOM,在Linux上正确显示,但在Windows上失败(使用GCC 7.4)...
#include <stdio.h>
#include <errno.h>
#include <math.h>
int main () {
double val;
errno = 0;
val = sqrt(-10);
if(errno == EDOM) {
printf("Invalid value \n");
} else {
printf("Valid value\n");
}
errno = 0;
val = sqrt(10);
if(errno == EDOM) {
printf("Invalid value\n");
} else {
printf("Valid value\n");
}
return(0);
}
Run Code Online (Sandbox Code Playgroud)
预期结果:无效值有效值实际结果:有效值有效值
不需要设置数学功能errno。他们可以,但不必这样做。参见C标准的7.12.1节。从理论上讲,您可以检查全局常量的值,math_errhandling以了解它们是否可以,但是在我所知道的任何实现上都不是完全可靠的,甚至可能没有定义(这是一个宏,因此至少可以使用#ifdef它来进行检查) )。
相反,您可以在调用之前检查输入是否为负sqrt,或者(如果您的实现适当地详细支持IEEE 754),则可以在之后检查输出是否为NaN(使用isnan)。