标准数学函数能否正确处理无穷大?

xiv*_*r77 4 c c++ math floating-point

int main() {
    double inf = INFINITY;
    double pi = acos(-1.0);
    printf("[1]: %f %f\n", atan(inf) / pi, atan(-inf) / pi);
    printf("[2]: %f %f\n", tan(inf) / pi, tan(-inf) / pi);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产出

[1]: 0.500000 -0.500000
[2]: -nan -nan
Run Code Online (Sandbox Code Playgroud)

标准是否定义了这种行为?是[2]未定义的行为吗?未指定?

我想确定至少[1]是一个有保证的结果。

bas*_*hrc 5

两者都是定义明确的行为。引用自http://en.cppreference.com

  • 棕褐色

    如果参数为 ±0,则返回未修改。
    如果参数为 ±?,则返回 NaN 并引发 FE_INVALID。
    如果参数是 NaN,则返回 NaN。

  • 晒黑

    如果参数为 ±0,则返回未修改。
    如果参数是 +?,则返回 +?/2。
    如果参数是 -?,则返回 -?/2。
    如果参数是 NaN,则返回 NaN。