为什么carg(-0)返回-pi?

问题描述 投票:0回答:1

我注意到,在 C 中使用

double complex
数字时,当将具有负 0 虚部的实数传递给
carg()
-
M_PI
时,会返回而不是 0 或
M_PI
。这是为什么?我发现这一点是因为另一个使用
carg()
的函数返回了错误的虚部符号(被
carg()
的这种行为破坏的函数是 newlibs cpow)。

这是一个 MWE 来展示该行为:

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

int main(void) {

    double complex a = 2;

    printf("creal(a): %f\n", creal(a));
    printf("cimag(a): %f\n", cimag(a));
    printf("carg(a): %f\n", carg(a));

    printf("\n");

    printf("creal(-a): %f\n", creal(-a));
    printf("cimag(-a): %f\n", cimag(-a));
    printf("carg(-a): %f\n", carg(-a));

    printf("\n");
    a = 0;
    printf("creal(-a): %f\n", creal(-a));
    printf("cimag(-a): %f\n", cimag(-a));
    printf("carg(-a): %f\n", carg(-a));

}

这是使用 gcc 14.2.0 编译后的结果:

creal(a): 2.000000
cimag(a): 0.000000
carg(a): 0.000000

creal(-a): -2.000000
cimag(-a): -0.000000
carg(-a): -3.141593

creal(-a): -0.000000
cimag(-a): -0.000000
carg(-a): -3.141593

c floating-point
1个回答
0
投票

复数 x + yi 的相位角(即

carg
计算值)定义为 atan y/x

因此,C标准

carg(x + yi)
定义为G.6p3节中的
atan2(y,x)

C 标准的 F.10.1.4 节规定

atan2
对于某些边缘情况返回以下值:

  • atan2(±0, −0)
    返回 ± π
  • atan2(±0, +0)
    返回 ±0。
  • atan2(±0, x)
    返回 x < 0.
  • 的 ± π 当 x > 0 时,
  • atan2(±0, x)
    返回 ±0。
  • atan2(y, ±0)
    对于 y < 0.
  • 返回 − π /2
  • atan2(y, ±0)
    对于 y > 0,返回 π /2。
  • atan2(±y, − ∞)
    对于有限 y > 0,返回 ± π。
  • 对于有限 y > 0,
  • atan2(±y, + ∞)
    返回 ±0。
  • atan2(± ∞, x)
    对于有限的 x,返回 ± π /2。
  • atan2(± ∞, − ∞)
    返回 ±3 π /4。
  • atan2(± ∞, + ∞)
    返回 ± π /4。

这与您看到的输出一致。

© www.soinside.com 2019 - 2024. All rights reserved.