Le sam. 21 déc. 2019 à 00:05, Alex Herbert <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. Regards, Gilles > > Alex > > > [1] 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> > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org