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

What is the Difference Between argf and atan2f in C++?

提问人:Emmett Palaima 提问时间:7/14/2023 更新时间:7/14/2023 访问量:82

问:

我正在使用 FFT 数学进行一个项目,遇到需要计算实部和虚部 FFT 分量的相位角的情况。在一些例子中,我看到人们使用 atan2f 来做到这一点,在一些例子中,我看到人们在复数类旁边使用 argf。

除了接受两个单独的参数与单个复数参数之外,这两个函数的操作方式有什么区别吗?如果是这样,有什么区别?

一直在网上搜索各种文档,似乎找不到这个问题的清晰或简洁的答案。

谢谢!

这个消息来源特别令人困惑:

如果没有发生错误,则返回区间 [−π; π] 中 z 的相位角。 错误和特殊情况的处理方式就像函数实现为 std::atan2(std::imag(z), std::real(z)) 一样。

目前尚不清楚它们是在所有情况下都是等效的,还是仅在存在边缘情况或错误时才等效。

C++ FFT 标准复

评论

1赞 doug 7/14/2023
明显的错误情况是 这里有一个链接,描述了 的极端情况和溢出/下溢。我希望做同样的事情0+0iatan2std::argatan2
0赞 Cris Luengo 7/14/2023
en.cppreference.com/w/cpp/numeric/complex/arg 清楚地表明可以通过调用来实现,我认为如果不这样做,实现将是愚蠢的(因为他们会两次实现同样的事情)。argatan2

答:

5赞 Artyer 7/14/2023 #1

[complex.value.ops]第 4 页

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

返回值:或 的相位角。xatan2(imag(x), real(x))

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

如果你的复数恰好没有相位(例如,或),将遵循这些参数的结果。NaN+1j0+0jstd::argstd::atan2

评论

0赞 Cris Luengo 7/14/2023
“如果你的复数恰好没有相位,将遵循 的结果”否则它也会遵循 的结果。为什么会出现这种情况?std::argstd::atan2std::atan2
0赞 Artyer 7/14/2023
@CrisLuengo 只是在原始问题中解决引号“错误和特殊情况的处理,就好像函数被实现为 std::atan2(std::imag(z), std::real(z)).”