Average Error: 30.7 → 17.0
Time: 4.1s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -6.435791861848148 \cdot 10^{+153}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 7.07576562131624 \cdot 10^{-253}:\\ \;\;\;\;\log \left(\sqrt{im \cdot im + re \cdot re}\right)\\ \mathbf{elif}\;re \le 3.6038808942744265 \cdot 10^{-158}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 2.5731787747213785 \cdot 10^{+101}:\\ \;\;\;\;\log \left(\sqrt{im \cdot im + re \cdot re}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]
\log \left(\sqrt{re \cdot re + im \cdot im}\right)
\begin{array}{l}
\mathbf{if}\;re \le -6.435791861848148 \cdot 10^{+153}:\\
\;\;\;\;\log \left(-re\right)\\

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

\mathbf{elif}\;re \le 3.6038808942744265 \cdot 10^{-158}:\\
\;\;\;\;\log im\\

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

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

\end{array}
double f(double re, double im) {
        double r2043771 = re;
        double r2043772 = r2043771 * r2043771;
        double r2043773 = im;
        double r2043774 = r2043773 * r2043773;
        double r2043775 = r2043772 + r2043774;
        double r2043776 = sqrt(r2043775);
        double r2043777 = log(r2043776);
        return r2043777;
}

double f(double re, double im) {
        double r2043778 = re;
        double r2043779 = -6.435791861848148e+153;
        bool r2043780 = r2043778 <= r2043779;
        double r2043781 = -r2043778;
        double r2043782 = log(r2043781);
        double r2043783 = 7.07576562131624e-253;
        bool r2043784 = r2043778 <= r2043783;
        double r2043785 = im;
        double r2043786 = r2043785 * r2043785;
        double r2043787 = r2043778 * r2043778;
        double r2043788 = r2043786 + r2043787;
        double r2043789 = sqrt(r2043788);
        double r2043790 = log(r2043789);
        double r2043791 = 3.6038808942744265e-158;
        bool r2043792 = r2043778 <= r2043791;
        double r2043793 = log(r2043785);
        double r2043794 = 2.5731787747213785e+101;
        bool r2043795 = r2043778 <= r2043794;
        double r2043796 = log(r2043778);
        double r2043797 = r2043795 ? r2043790 : r2043796;
        double r2043798 = r2043792 ? r2043793 : r2043797;
        double r2043799 = r2043784 ? r2043790 : r2043798;
        double r2043800 = r2043780 ? r2043782 : r2043799;
        return r2043800;
}

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 < -6.435791861848148e+153

    1. Initial program 61.9

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

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

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

    if -6.435791861848148e+153 < re < 7.07576562131624e-253 or 3.6038808942744265e-158 < re < 2.5731787747213785e+101

    1. Initial program 18.9

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

    if 7.07576562131624e-253 < re < 3.6038808942744265e-158

    1. Initial program 29.9

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

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

    if 2.5731787747213785e+101 < re

    1. Initial program 50.6

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -6.435791861848148 \cdot 10^{+153}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 7.07576562131624 \cdot 10^{-253}:\\ \;\;\;\;\log \left(\sqrt{im \cdot im + re \cdot re}\right)\\ \mathbf{elif}\;re \le 3.6038808942744265 \cdot 10^{-158}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 2.5731787747213785 \cdot 10^{+101}:\\ \;\;\;\;\log \left(\sqrt{im \cdot im + re \cdot re}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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