Average Error: 31.8 → 17.3
Time: 10.9s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -3.510504290224585263553036624607276929802 \cdot 10^{110}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 2.808181869483482800731614586522121158678 \cdot 10^{83}:\\ \;\;\;\;\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 -3.510504290224585263553036624607276929802 \cdot 10^{110}:\\
\;\;\;\;\log \left(-re\right)\\

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

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

\end{array}
double f(double re, double im) {
        double r3351835 = re;
        double r3351836 = r3351835 * r3351835;
        double r3351837 = im;
        double r3351838 = r3351837 * r3351837;
        double r3351839 = r3351836 + r3351838;
        double r3351840 = sqrt(r3351839);
        double r3351841 = log(r3351840);
        return r3351841;
}

double f(double re, double im) {
        double r3351842 = re;
        double r3351843 = -3.510504290224585e+110;
        bool r3351844 = r3351842 <= r3351843;
        double r3351845 = -r3351842;
        double r3351846 = log(r3351845);
        double r3351847 = 2.808181869483483e+83;
        bool r3351848 = r3351842 <= r3351847;
        double r3351849 = im;
        double r3351850 = r3351849 * r3351849;
        double r3351851 = r3351842 * r3351842;
        double r3351852 = r3351850 + r3351851;
        double r3351853 = sqrt(r3351852);
        double r3351854 = log(r3351853);
        double r3351855 = log(r3351842);
        double r3351856 = r3351848 ? r3351854 : r3351855;
        double r3351857 = r3351844 ? r3351846 : r3351856;
        return r3351857;
}

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.510504290224585e+110

    1. Initial program 52.9

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

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

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

    if -3.510504290224585e+110 < re < 2.808181869483483e+83

    1. Initial program 21.9

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

    if 2.808181869483483e+83 < re

    1. Initial program 47.9

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -3.510504290224585263553036624607276929802 \cdot 10^{110}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 2.808181869483482800731614586522121158678 \cdot 10^{83}:\\ \;\;\;\;\log \left(\sqrt{im \cdot im + re \cdot re}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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