Average Error: 31.9 → 18.5
Time: 1.2s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -7.94133120904831091 \cdot 10^{23}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -1.05078470045216924 \cdot 10^{-159}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 4.3626224287444165 \cdot 10^{-306}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 43187.278897220196:\\ \;\;\;\;\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 -7.94133120904831091 \cdot 10^{23}:\\
\;\;\;\;\log \left(-1 \cdot re\right)\\

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

\mathbf{elif}\;re \le 4.3626224287444165 \cdot 10^{-306}:\\
\;\;\;\;\log im\\

\mathbf{elif}\;re \le 43187.278897220196:\\
\;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\

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

\end{array}
double f(double re, double im) {
        double r37671 = re;
        double r37672 = r37671 * r37671;
        double r37673 = im;
        double r37674 = r37673 * r37673;
        double r37675 = r37672 + r37674;
        double r37676 = sqrt(r37675);
        double r37677 = log(r37676);
        return r37677;
}

double f(double re, double im) {
        double r37678 = re;
        double r37679 = -7.941331209048311e+23;
        bool r37680 = r37678 <= r37679;
        double r37681 = -1.0;
        double r37682 = r37681 * r37678;
        double r37683 = log(r37682);
        double r37684 = -1.0507847004521692e-159;
        bool r37685 = r37678 <= r37684;
        double r37686 = r37678 * r37678;
        double r37687 = im;
        double r37688 = r37687 * r37687;
        double r37689 = r37686 + r37688;
        double r37690 = sqrt(r37689);
        double r37691 = log(r37690);
        double r37692 = 4.3626224287444165e-306;
        bool r37693 = r37678 <= r37692;
        double r37694 = log(r37687);
        double r37695 = 43187.278897220196;
        bool r37696 = r37678 <= r37695;
        double r37697 = log(r37678);
        double r37698 = r37696 ? r37691 : r37697;
        double r37699 = r37693 ? r37694 : r37698;
        double r37700 = r37685 ? r37691 : r37699;
        double r37701 = r37680 ? r37683 : r37700;
        return r37701;
}

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 < -7.941331209048311e+23

    1. Initial program 41.9

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

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

    if -7.941331209048311e+23 < re < -1.0507847004521692e-159 or 4.3626224287444165e-306 < re < 43187.278897220196

    1. Initial program 20.7

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

    if -1.0507847004521692e-159 < re < 4.3626224287444165e-306

    1. Initial program 31.3

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

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

    if 43187.278897220196 < re

    1. Initial program 41.2

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -7.94133120904831091 \cdot 10^{23}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -1.05078470045216924 \cdot 10^{-159}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 4.3626224287444165 \cdot 10^{-306}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 43187.278897220196:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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