Average Error: 30.5 → 17.3
Time: 4.2s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -4.2823925071895756 \cdot 10^{+108}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le -6.3441075981154 \cdot 10^{-203}:\\ \;\;\;\;\log \left(\sqrt{im \cdot im + re \cdot re}\right)\\ \mathbf{elif}\;re \le 3.6570017014633 \cdot 10^{-252}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 3.792053728085163 \cdot 10^{+38}:\\ \;\;\;\;\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.2823925071895756 \cdot 10^{+108}:\\
\;\;\;\;\log \left(-re\right)\\

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

\mathbf{elif}\;re \le 3.6570017014633 \cdot 10^{-252}:\\
\;\;\;\;\log im\\

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

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

\end{array}
double f(double re, double im) {
        double r660929 = re;
        double r660930 = r660929 * r660929;
        double r660931 = im;
        double r660932 = r660931 * r660931;
        double r660933 = r660930 + r660932;
        double r660934 = sqrt(r660933);
        double r660935 = log(r660934);
        return r660935;
}

double f(double re, double im) {
        double r660936 = re;
        double r660937 = -4.2823925071895756e+108;
        bool r660938 = r660936 <= r660937;
        double r660939 = -r660936;
        double r660940 = log(r660939);
        double r660941 = -6.3441075981154e-203;
        bool r660942 = r660936 <= r660941;
        double r660943 = im;
        double r660944 = r660943 * r660943;
        double r660945 = r660936 * r660936;
        double r660946 = r660944 + r660945;
        double r660947 = sqrt(r660946);
        double r660948 = log(r660947);
        double r660949 = 3.6570017014633e-252;
        bool r660950 = r660936 <= r660949;
        double r660951 = log(r660943);
        double r660952 = 3.792053728085163e+38;
        bool r660953 = r660936 <= r660952;
        double r660954 = log(r660936);
        double r660955 = r660953 ? r660948 : r660954;
        double r660956 = r660950 ? r660951 : r660955;
        double r660957 = r660942 ? r660948 : r660956;
        double r660958 = r660938 ? r660940 : r660957;
        return r660958;
}

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

    1. Initial program 51.3

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

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

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

    if -4.2823925071895756e+108 < re < -6.3441075981154e-203 or 3.6570017014633e-252 < re < 3.792053728085163e+38

    1. Initial program 19.1

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

    if -6.3441075981154e-203 < re < 3.6570017014633e-252

    1. Initial program 28.1

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

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

    if 3.792053728085163e+38 < re

    1. Initial program 41.6

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -4.2823925071895756 \cdot 10^{+108}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le -6.3441075981154 \cdot 10^{-203}:\\ \;\;\;\;\log \left(\sqrt{im \cdot im + re \cdot re}\right)\\ \mathbf{elif}\;re \le 3.6570017014633 \cdot 10^{-252}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 3.792053728085163 \cdot 10^{+38}:\\ \;\;\;\;\log \left(\sqrt{im \cdot im + re \cdot re}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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