argf和atan2f在C++中有什么区别?

3
我正在使用FFT数学进行一个项目,遇到了需要计算实部和虚部FFT分量的相位角的情况。在一些示例中,我看到有人使用atan2f来做这个,而在一些示例中,我看到有人在复数类旁边使用argf。
除了接受两个单独参数与接受一个复数参数之外,这两个函数的操作方式是否有任何区别?如果有的话,有什么区别?
我已经在各种在线文档中搜索了很久,似乎找不到对这个问题的明确或简明的答案。
谢谢!
这个来源特别令人困惑:
如果没有发生错误,返回z在区间[-π; π]内的相位角。错误和特殊情况的处理方式就好像该函数被实现为std::atan2(std::imag(z), std::real(z))。
这并不清楚它们在所有情况下是否等价,还是只有在边缘情况或错误时才等价。

1
明显的错误情况是0+0i。这里有一个链接在这里,描述了atan2的边界情况和溢出/下溢。我期望std::arg对于这些情况与atan2相同。 - doug
1
明显的错误情况是0+0i。这里有一个链接点击这里,描述了atan2的边界情况和溢出/下溢。我期望std::arg对于这些情况与atan2相同。 - doug
1
明显的错误情况是0+0i。这里有一个链接在这里,描述了atan2的边界情况和溢出/下溢。我期望std::arg对于这些情况与atan2的行为相同。 - undefined
https://en.cppreference.com/w/cpp/numeric/complex/arg清楚地指出`arg`可以通过调用`atan2`来实现,我认为如果它们没有这样做的话,那么实现就是愚蠢的(因为他们会重复实现同样的功能)。 - Cris Luengo
https://en.cppreference.com/w/cpp/numeric/complex/arg清楚地表明`arg`可以通过调用`atan2`来实现,我认为如果不这样做的话,实现将是愚蠢的(因为它们会重复实现同一件事情)。 - Cris Luengo
1个回答

5

[complex.value.ops]p4:

template<class T> T arg(const complex<T>& x);

Returns: The phase angle of x, or atan2(imag(x), real(x)).

没有区别,std::arg(std::complex(x, y)) 就是 std::atan2(y, x)

如果你的复数没有相位(例如,NaN+1j 或者 0+0j),std::arg 会按照这些参数的 std::atan2 结果进行计算。


如果你的复数没有相位,std::arg将遵循std::atan2的结果。否则,它也会遵循std::atan2的结果。为什么要有这个条件? - Cris Luengo
如果你的复数恰好没有相位,std::arg将遵循std::atan2的结果。否则它也会遵循std::atan2的结果。为什么有这个条件呢? - Cris Luengo
如果你的复数恰好没有相位,std::arg将遵循std::atan2的结果。否则,它也将遵循std::atan2的结果。为什么有这个条件呢? - undefined
@CrisLuengo 在原始问题中,只是针对引用“错误和特殊情况被处理得就像函数实现为std::atan2(std::imag(z), std::real(z))。”进行回答。 - Artyer
@CrisLuengo 在原始问题中,只是针对引用“错误和特殊情况被处理得就像函数实现为std::atan2(std::imag(z), std::real(z))”进行回答。 - Artyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接