我注意到,在 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
复数 x + yi 的相位角(即
carg
计算值)定义为 atan y/x。
因此,C标准将
carg(x + yi)
定义为G.6p3节中的atan2(y,x)
。
C 标准的 F.10.1.4 节规定
atan2
对于某些边缘情况返回以下值:
返回 ± πatan2(±0, −0)
返回 ±0。atan2(±0, +0)
- 的 ± π 当 x > 0 时,
返回 x < 0.atan2(±0, x)
返回 ±0。atan2(±0, x)
- 返回 − π /2
对于 y < 0.atan2(y, ±0)
对于 y > 0,返回 π /2。atan2(y, ±0)
- 对于有限 y > 0,
对于有限 y > 0,返回 ± π。atan2(±y, − ∞)
返回 ±0。atan2(±y, + ∞)
对于有限的 x,返回 ± π /2。atan2(± ∞, x)
返回 ±3 π /4。atan2(± ∞, − ∞)
返回 ± π /4。atan2(± ∞, + ∞)
这与您看到的输出一致。