Average Error: 31.9 → 17.5
Time: 2.5s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -9.040563023697554117134626098062771221449 \cdot 10^{108}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 1.876761322676858408683984671658326382422 \cdot 10^{119}:\\ \;\;\;\;\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 -9.040563023697554117134626098062771221449 \cdot 10^{108}:\\
\;\;\;\;\log \left(-re\right)\\

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

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

\end{array}
double f(double re, double im) {
        double r34970 = re;
        double r34971 = r34970 * r34970;
        double r34972 = im;
        double r34973 = r34972 * r34972;
        double r34974 = r34971 + r34973;
        double r34975 = sqrt(r34974);
        double r34976 = log(r34975);
        return r34976;
}

double f(double re, double im) {
        double r34977 = re;
        double r34978 = -9.040563023697554e+108;
        bool r34979 = r34977 <= r34978;
        double r34980 = -r34977;
        double r34981 = log(r34980);
        double r34982 = 1.8767613226768584e+119;
        bool r34983 = r34977 <= r34982;
        double r34984 = r34977 * r34977;
        double r34985 = im;
        double r34986 = r34985 * r34985;
        double r34987 = r34984 + r34986;
        double r34988 = sqrt(r34987);
        double r34989 = log(r34988);
        double r34990 = log(r34977);
        double r34991 = r34983 ? r34989 : r34990;
        double r34992 = r34979 ? r34981 : r34991;
        return r34992;
}

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 < -9.040563023697554e+108

    1. Initial program 54.3

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

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

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

    if -9.040563023697554e+108 < re < 1.8767613226768584e+119

    1. Initial program 21.6

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

    if 1.8767613226768584e+119 < re

    1. Initial program 55.9

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -9.040563023697554117134626098062771221449 \cdot 10^{108}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 1.876761322676858408683984671658326382422 \cdot 10^{119}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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