> On 20 Dec 2019, at 23:45, Gilles Sadowski <gillese...@gmail.com> wrote:
> 
> Le sam. 21 déc. 2019 à 00:05, Alex Herbert <alex.d.herb...@gmail.com 
> <mailto:alex.d.herb...@gmail.com>> a écrit :
>> 
>> Looking at the c++ standard [1] we are missing this function:
>> 
>> norm() = a^2 + b^2
>> 
>> The field norm of the complex, or the square of the absolute. An example on 
>> C++ reference states that this is faster for comparing magnitudes for 
>> ranking as it avoids the sqrt() required in abs().
>> 
>> z.abs() > y.abs()  ==  z.norm() > y.norm()
>> 
>> 
>> I suggest this is added to comply with the standard.
> 
> +1
> 
>> 
>> 
>> It seems odd to me that the constructor ofPolar throws an exception. It does 
>> this when the magnitude (rho) for the complex is negative. However if the 
>> magnitude is NaN it will not throw an exception and will end up returning 
>> NaN. I think this should be changed to return NaN for negative magnitude and 
>> avoid exceptions. This is basically stating that the polar representation 
>> you used is invalid and so in the Cartesian representation it will be (nan, 
>> nan).
>> 
>> The C++ standard on this was previously vague and was clarified in [2]:
>> 
>> “
>> -?- Requires: rho shall be non-negative and non-NaN. theta shall be finite.
>> 
>> -9- Returns: The complex value corresponding to a complex number whose 
>> magnitude is rho and whose phase angle is theta.
>> “
>> 
>> The assumption is that abs(polar(rho, theta)) == rho.
>> 
>> If this cannot be ensured then polar(rho, theta) is undefined and we return 
>> NaN.
>> 
>> 
>> Note that if theta is finite and rho is non-negative and non-nan:
>> 
>> x = rho * Math.cos(theta)
>> y = rho * Math.sin(theta)
>> 
>> In the event that sin(theta) is zero (i.e. theta is zero) then inf * 0 is 
>> NaN. In this case the complex could either be:
>> 
>> (Inf, nan) or (inf, 0)
>> 
>> I have tried 2 c++ implementations and both return (inf, nan). The c++ 
>> <complex> header I have found would return (inf, 0). The same header also 
>> corrects if cos(theta) is zero however in Java cos(pi/2) is not zero so this 
>> is not an issue.
>> 
>> Note:
>> If the result is (inf, nan) then abs((inf, nan)) should return inf to 
>> satisfy the contract abs(polar(rho, theta)) == rho. This is currently true 
>> as abs() uses Math.hypot(x, y) which will return positive infinity if either 
>> argument is infinite. So I do not think it matters. An infinite is infinite 
>> even when the other part is nan.
>> 
>> 
>> I suggest we update ofPolar to not throw exceptions and return NAN unless 
>> theta is finite and rho is non-negative and non-nan.
> 
> +0
> Not sure how useful it is to instantiate a useless object.

It would not be instantiated. It can use the singleton NaN. But I do see your 
point. Something has gone wrong so raise it as a problem.

Looking at various implementations the polar(rho, theta) method is used when 
computing results in polar coordinates to then return a result. For example 
this is used in various sqrt() implementations as the equivalent of:

Complex.ofPolar(Math.sqrt(z.abs()), z.arg() / 2)

In this case it would not be nice to throw an exception for a complex z which 
is NaN. Instead return NaN as the sqrt of NaN.

I thought it would be more in line with the c++ standard to not throw 
exceptions. I also think that returning NaN is more in line with how 
java.util.Math handles invalid cases.


> 
> Regards,
> Gilles
> 
>> 
>> Alex
>> 
>> 
>> [1] http://www.cplusplus.com/reference/complex/ 
>> <http://www.cplusplus.com/reference/complex/> 
>> <http://www.cplusplus.com/reference/complex/ 
>> <http://www.cplusplus.com/reference/complex/>>
>> [2] https://cplusplus.github.io/LWG/issue2459 
>> <https://cplusplus.github.io/LWG/issue2459> 
>> <https://cplusplus.github.io/LWG/issue2459 
>> <https://cplusplus.github.io/LWG/issue2459>>
>> 
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org 
> <mailto:dev-unsubscr...@commons.apache.org>
> For additional commands, e-mail: dev-h...@commons.apache.org 
> <mailto:dev-h...@commons.apache.org>

Reply via email to