C语言中EDOM和ERANGE的区别?

Ton*_*hao 2 c errno

errno从标准库函数捕获错误消息。然而,有两个宏观值EDOMERANGE我发现很难区分。

cppreference 中的示例代码将执行以下操作

#include <stdio.h>
#include <math.h>
#include <errno.h>

void show_errno(void)
{
    const char *err_info = "unknown error";
    switch (errno) {
    case EDOM:
        err_info = "domain error";
        break;
    case EILSEQ:
        err_info = "illegal sequence";
        break;
    case ERANGE:
        err_info = "pole or range error";
        break;
    case 0:
        err_info = "no error";
    }
    fputs(err_info, stdout);
    puts(" occurred");
}

int main(void)
{
    errno = 0;
    acos(+1.1);
    show_errno();
 
    errno = 0;
    log(0.0);
    show_errno();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它会产生

domain error occurred
pole or range error occurred
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:什么操作会导致errno变成EDOM,什么操作会导致它变成ERANGE

chu*_*ica 7

\n

...什么操作会导致errno变成EDOM,什么操作会导致它变成ERANGE

\n
\n
\n

这些是可以绘制图表的数学函数:y = f(x). 自变量的无效值x将产生“域”错误。因变量的无效值y将产生“范围”错误。 @Fe2O3

\n
\n

或者

\n
\n

EDOM意味着数学函数没有在那里定义,并且ERANGE意味着计算函数无法给出数学结果,因为它无法以结果格式表示。 @埃里克·波斯特皮斯基尔

\n
\n
\n

EDOMERANGE在 C 标准中定义。

\n
\n

对于所有函数 ( <math.h>),当且仅当输入参数位于定义数学函数的域之外时,才会发生域错误。C17dr \xc2\xa7 7.12.1 2

\n
\n

例如sqrt(-1)

\n
\n

同样,当且仅当函数的数学结果由于极值而无法在指定类型的对象中表示时,才会发生范围错误。\xc2\xa7 7.12.1 4

\n
\n

例如strtol("1234567890123456789012345678901234567890", 0, 0)

\n

  • 更清楚。“EDOM”表示数学函数未定义,而“ERANGE”表示计算函数无法给出数学结果,因为它无法以结果格式表示。 (2认同)