Average Error: 30.3 → 16.8
Time: 3.5s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -4.2086579624594044 \cdot 10^{+130}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 3.714487936304632 \cdot 10^{+58}:\\ \;\;\;\;\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 -4.2086579624594044 \cdot 10^{+130}:\\
\;\;\;\;\log \left(-re\right)\\

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

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

\end{array}
double f(double re, double im) {
        double r2080142 = re;
        double r2080143 = r2080142 * r2080142;
        double r2080144 = im;
        double r2080145 = r2080144 * r2080144;
        double r2080146 = r2080143 + r2080145;
        double r2080147 = sqrt(r2080146);
        double r2080148 = log(r2080147);
        return r2080148;
}

double f(double re, double im) {
        double r2080149 = re;
        double r2080150 = -4.2086579624594044e+130;
        bool r2080151 = r2080149 <= r2080150;
        double r2080152 = -r2080149;
        double r2080153 = log(r2080152);
        double r2080154 = 3.714487936304632e+58;
        bool r2080155 = r2080149 <= r2080154;
        double r2080156 = im;
        double r2080157 = r2080156 * r2080156;
        double r2080158 = r2080149 * r2080149;
        double r2080159 = r2080157 + r2080158;
        double r2080160 = sqrt(r2080159);
        double r2080161 = log(r2080160);
        double r2080162 = log(r2080149);
        double r2080163 = r2080155 ? r2080161 : r2080162;
        double r2080164 = r2080151 ? r2080153 : r2080163;
        return r2080164;
}

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 3 regimes
  2. if re < -4.2086579624594044e+130

    1. Initial program 56.6

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

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

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

    if -4.2086579624594044e+130 < re < 3.714487936304632e+58

    1. Initial program 20.6

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

    if 3.714487936304632e+58 < re

    1. Initial program 44.1

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -4.2086579624594044 \cdot 10^{+130}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 3.714487936304632 \cdot 10^{+58}:\\ \;\;\;\;\log \left(\sqrt{im \cdot im + re \cdot re}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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