Average Error: 31.9 → 17.6
Time: 1.5s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -3.809146632081261456055697196886220676549 \cdot 10^{47}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -5.899676996224969797473356094348485392996 \cdot 10^{-185}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 2.570866863735433156870358275922364395788 \cdot 10^{-296}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 3.629021834301344361694623304417316639458 \cdot 10^{121}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]
\log \left(\sqrt{re \cdot re + im \cdot im}\right)
\begin{array}{l}
\mathbf{if}\;re \le -3.809146632081261456055697196886220676549 \cdot 10^{47}:\\
\;\;\;\;\log \left(-1 \cdot re\right)\\

\mathbf{elif}\;re \le -5.899676996224969797473356094348485392996 \cdot 10^{-185}:\\
\;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\

\mathbf{elif}\;re \le 2.570866863735433156870358275922364395788 \cdot 10^{-296}:\\
\;\;\;\;\log im\\

\mathbf{elif}\;re \le 3.629021834301344361694623304417316639458 \cdot 10^{121}:\\
\;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\

\mathbf{else}:\\
\;\;\;\;\log re\\

\end{array}
double f(double re, double im) {
        double r81513 = re;
        double r81514 = r81513 * r81513;
        double r81515 = im;
        double r81516 = r81515 * r81515;
        double r81517 = r81514 + r81516;
        double r81518 = sqrt(r81517);
        double r81519 = log(r81518);
        return r81519;
}

double f(double re, double im) {
        double r81520 = re;
        double r81521 = -3.8091466320812615e+47;
        bool r81522 = r81520 <= r81521;
        double r81523 = -1.0;
        double r81524 = r81523 * r81520;
        double r81525 = log(r81524);
        double r81526 = -5.89967699622497e-185;
        bool r81527 = r81520 <= r81526;
        double r81528 = r81520 * r81520;
        double r81529 = im;
        double r81530 = r81529 * r81529;
        double r81531 = r81528 + r81530;
        double r81532 = sqrt(r81531);
        double r81533 = log(r81532);
        double r81534 = 2.570866863735433e-296;
        bool r81535 = r81520 <= r81534;
        double r81536 = log(r81529);
        double r81537 = 3.6290218343013444e+121;
        bool r81538 = r81520 <= r81537;
        double r81539 = log(r81520);
        double r81540 = r81538 ? r81533 : r81539;
        double r81541 = r81535 ? r81536 : r81540;
        double r81542 = r81527 ? r81533 : r81541;
        double r81543 = r81522 ? r81525 : r81542;
        return r81543;
}

Error

Bits error versus re

Bits error versus im

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Split input into 4 regimes
  2. if re < -3.8091466320812615e+47

    1. Initial program 44.7

      \[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
    2. Taylor expanded around -inf 11.1

      \[\leadsto \log \color{blue}{\left(-1 \cdot re\right)}\]

    if -3.8091466320812615e+47 < re < -5.89967699622497e-185 or 2.570866863735433e-296 < re < 3.6290218343013444e+121

    1. Initial program 19.8

      \[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]

    if -5.89967699622497e-185 < re < 2.570866863735433e-296

    1. Initial program 31.3

      \[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
    2. Taylor expanded around 0 33.7

      \[\leadsto \log \color{blue}{im}\]

    if 3.6290218343013444e+121 < re

    1. Initial program 55.6

      \[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
    2. Taylor expanded around inf 7.7

      \[\leadsto \log \color{blue}{re}\]
  3. Recombined 4 regimes into one program.
  4. Final simplification17.6

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -3.809146632081261456055697196886220676549 \cdot 10^{47}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -5.899676996224969797473356094348485392996 \cdot 10^{-185}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 2.570866863735433156870358275922364395788 \cdot 10^{-296}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 3.629021834301344361694623304417316639458 \cdot 10^{121}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

herbie shell --seed 2019318 
(FPCore (re im)
  :name "math.log/1 on complex, real part"
  :precision binary64
  (log (sqrt (+ (* re re) (* im im)))))