Average Error: 31.3 → 16.9
Time: 1.1s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -3.6980740601030615 \cdot 10^{63}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le 9.1753737888878369 \cdot 10^{116}:\\ \;\;\;\;\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.6980740601030615 \cdot 10^{63}:\\
\;\;\;\;\log \left(-1 \cdot re\right)\\

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

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

\end{array}
double f(double re, double im) {
        double r85842 = re;
        double r85843 = r85842 * r85842;
        double r85844 = im;
        double r85845 = r85844 * r85844;
        double r85846 = r85843 + r85845;
        double r85847 = sqrt(r85846);
        double r85848 = log(r85847);
        return r85848;
}

double f(double re, double im) {
        double r85849 = re;
        double r85850 = -3.6980740601030615e+63;
        bool r85851 = r85849 <= r85850;
        double r85852 = -1.0;
        double r85853 = r85852 * r85849;
        double r85854 = log(r85853);
        double r85855 = 9.175373788887837e+116;
        bool r85856 = r85849 <= r85855;
        double r85857 = r85849 * r85849;
        double r85858 = im;
        double r85859 = r85858 * r85858;
        double r85860 = r85857 + r85859;
        double r85861 = sqrt(r85860);
        double r85862 = log(r85861);
        double r85863 = log(r85849);
        double r85864 = r85856 ? r85862 : r85863;
        double r85865 = r85851 ? r85854 : r85864;
        return r85865;
}

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 < -3.6980740601030615e+63

    1. Initial program 46.0

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

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

    if -3.6980740601030615e+63 < re < 9.175373788887837e+116

    1. Initial program 21.2

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

    if 9.175373788887837e+116 < re

    1. Initial program 55.4

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -3.6980740601030615 \cdot 10^{63}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le 9.1753737888878369 \cdot 10^{116}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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