Hello.

2020-01-24 0:30 UTC+01:00, Alex Herbert <alex.d.herb...@gmail.com>:
> In short:
>
> - Math.hypot is required in Complex to compute sqrt(x^2 + y^2) without
> over/underflow to 1 ULP precision.
> - Complex also requires the same computation without the sqrt or
> over/underflow protection
> - I found the reference for Math.hypot and reimplemented the function
> - My port is 4x faster than Math.hypot and the same accuracy (or better)
> - I will add this as a private internal method in Complex
> - The source for the port requires the original licence is maintained
>
> The question is where to put the notice of the original license? Copying
> from commons RNG it would be in the source method javadoc and also in all
> LICENSE.txt files through the multi-module project. This seems excessive. I
> thought perhaps to include it only in numbers parent and then the complex
> module where it applies.

IIUC, this would agree with the recommendations here:
    http://www.apache.org/dev/licensing-howto.html

[By the way, we should perhaps remove the ".txt" suffix.]

Regards,
Gilles

>
>
> Background
>
> The complex class uses the Math.hypot(double, double) function to determine
> the absolute value of a complex number x + iy as sqrt(x^2 + y^2) without
> over/underflow to 1 ULP precision. This is used directly (in sqrt() and
> abs()) but also without the square root to compute x^2 + y^2 in the log()
> function. These functions also perform over/underflow protection and so
> ideally just require access to the same formula for high precision x^2 +
> y^2. This would enable consistency across the different methods that use the
> absolute of the complex number. Currently the hypot function is very slow in
> the Complex JMH benchmark so I looked into hypot.
>
> This function is known to be slow [1] pre-Java 9 which I was using for
> benchmarking. I found that in Java 9 the code was changed from calling a
> native function to an implementation in Java of the "Freely Distributable
> Maths Library" [2]. The JMH benchmark for complex shows an improvement
> between Java 8 and 9 of about 7-fold speed increase. However this does not
> allow access to the same computation without the square root. The source
> code for fdlibm has a permission license [3] so I have implemented a port
> that allows separation of the x^2 + y^2 computation from the sqrt and the
> overflow protection.
>
> In testing my ported version I found cases where it was more accurate than
> the Java reference, but none where it was less accurate. I attribute this to
> the different implementation of splitting a number into parts for high
> precision that is different in my port from the original. I used the split
> that is already present in Complex. I tested side-by-side an alternative
> that was closer to the method from fdlibm and it was a bit slower (in Java)
> and the same accuracy as the JDK reference. So I assume that the JDK
> reference has stuck exactly to the fdlibm code. I also found my port to be
> 4x faster than the Java reference. This may require more investigation but
> for now I would like to put my port into Complex as an internal method. Note
> the method is different from the commons FastMath.hypot implementation which
> does not compute the result to 1 ULP. I will add this to the JMH benchmark
> for reference so we have Math.hypot, FastMath.hypot and the hypot method
> within Complex.
>
> The licence for fdlibm is shown in [3]. This states that code can be
> copied/modified as long as the original notice is maintained. In commons RNG
> the licence for the port of the MersenneTwister is placed in the Java source
> file and in all LICENSE.txt files through the multi-module project. So
> should I do the same for numbers or just put the license into the complex
> module?
>
>
> [1]
> https://stackoverflow.com/questions/3764978/why-hypot-function-is-so-slow
> <https://stackoverflow.com/questions/3764978/why-hypot-function-is-so-slow>
>
> [2] https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7130085
> <https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7130085>
>
> [3] https://www.netlib.org/fdlibm/e_hypot.c
> <https://www.netlib.org/fdlibm/e_hypot.c>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to