This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++17 status.
std::polar
should require a non-negative rhoSection: 29.4.7 [complex.value.ops] Status: C++17 Submitter: Marshall Clow Opened: 2014-10-22 Last modified: 2017-07-30
Priority: 0
View all other issues in [complex.value.ops].
View all issues with C++17 status.
Discussion:
Different implementations give different answers for the following code:
#include <iostream> #include <complex> int main () { std::cout << std::polar(-1.0, -1.0) << '\n'; return 0; }
One implementation prints:
(nan, nan)
Another:
(-0.243068, 0.243068)
Which is correct? Or neither?
In this list, Howard Hinnant wrote:I've read this over several times. I've consulted C++11, C11, and IEC 10967-3. [snip]
I'm finding:
The magnitude of a complex number
== abs(c) == hypot(c.real(), c.imag())
and is always non-negative (by all three of the above standards).Therefore no complex number exists for which
abs(c) < 0
.Therefore when the first argument to
std::polar
(which is calledrho
) is negative, no complex number can be formed which meets the post-conidtion thatabs(c) == rho
.One could argue that this is already covered in 29.4 [complex.numbers]/3, but I think it's worth making explicit.
[2015-02, Cologne]
Discussion on whether theta should also be constrained.
TK: infinite theta doesn't make sense, whereas infinite rho does (theta is on a compact domain, rho is on a non-compact domain).
AM: We already have a narrow contract, so I don't mind adding further requirements. Any objections to requiring that theta be finite?
Some more discussion, but general consensus. Agreement that if someone finds the restrictions problematic, they should write
a proper paper to address how std::polar
should behave. For now, we allow infinite rho (but not NaN and not negative),
and require finite theta.
Proposed resolution:
This wording is relative to N4296.
Change 29.4.7 [complex.value.ops] around p9 as indicated
template<class T> complex<T> polar(const T& rho, const T& theta = 0);-?- Requires:
-9- Returns: The complex value corresponding to a complex number whose magnitude isrho
shall be non-negative and non-NaN.theta
shall be finite.rho
and whose phase angle istheta
.