Search code examples
javac++hypotenuse

Why hypot() function is so slow?


I did some testing with C++ hypot() and Java Math.hypot. They both seem to be significantly slower than sqrt(a*a + b*b). Is that because of a better precision? What method to calculate a hypotenuse hypot function uses? Surprisingly I couldn't find any indication of poor performance in the documentation.


Solution

  • It's not a simple sqrt function. You should check this link for the implementation of the algorithm: http://www.koders.com/c/fid7D3C8841ADC384A5F8DE0D081C88331E3909BF3A.aspx

    It has while loop to check for convergence

    /* Slower but safer algorithm due to Moler and Morrison.  Never
             produces any intermediate result greater than roughly the
             larger of X and Y.  Should converge to machine-precision
             accuracy in 3 iterations.  */
    
          double r = ratio*ratio, t, s, p = abig, q = asmall;
    
          do {
            t = 4. + r;
            if (t == 4.)
              break;
            s = r / t;
            p += 2. * s * p;
            q *= s;
            r = (q / p) * (q / p);
          } while (1);
    

    EDIT (Update from J.M):

    Here is the original Moler-Morrison paper, and here is a nice follow-up due to Dubrulle.