Average Error: 31.2 → 16.9
Time: 1.5s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -3.25652114888863578 \cdot 10^{112}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -1.74994020298687266 \cdot 10^{-290}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 1.2918788242355971 \cdot 10^{-219}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 1.20526441884369862 \cdot 10^{151}:\\ \;\;\;\;\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.25652114888863578 \cdot 10^{112}:\\
\;\;\;\;\log \left(-1 \cdot re\right)\\

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

\mathbf{elif}\;re \le 1.2918788242355971 \cdot 10^{-219}:\\
\;\;\;\;\log im\\

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

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

\end{array}
double f(double re, double im) {
        double r82944 = re;
        double r82945 = r82944 * r82944;
        double r82946 = im;
        double r82947 = r82946 * r82946;
        double r82948 = r82945 + r82947;
        double r82949 = sqrt(r82948);
        double r82950 = log(r82949);
        return r82950;
}

double f(double re, double im) {
        double r82951 = re;
        double r82952 = -3.2565211488886358e+112;
        bool r82953 = r82951 <= r82952;
        double r82954 = -1.0;
        double r82955 = r82954 * r82951;
        double r82956 = log(r82955);
        double r82957 = -1.7499402029868727e-290;
        bool r82958 = r82951 <= r82957;
        double r82959 = r82951 * r82951;
        double r82960 = im;
        double r82961 = r82960 * r82960;
        double r82962 = r82959 + r82961;
        double r82963 = sqrt(r82962);
        double r82964 = log(r82963);
        double r82965 = 1.2918788242355971e-219;
        bool r82966 = r82951 <= r82965;
        double r82967 = log(r82960);
        double r82968 = 1.2052644188436986e+151;
        bool r82969 = r82951 <= r82968;
        double r82970 = log(r82951);
        double r82971 = r82969 ? r82964 : r82970;
        double r82972 = r82966 ? r82967 : r82971;
        double r82973 = r82958 ? r82964 : r82972;
        double r82974 = r82953 ? r82956 : r82973;
        return r82974;
}

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 < -3.2565211488886358e+112

    1. Initial program 52.8

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

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

    if -3.2565211488886358e+112 < re < -1.7499402029868727e-290 or 1.2918788242355971e-219 < re < 1.2052644188436986e+151

    1. Initial program 19.2

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

    if -1.7499402029868727e-290 < re < 1.2918788242355971e-219

    1. Initial program 32.0

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

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

    if 1.2052644188436986e+151 < re

    1. Initial program 63.0

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -3.25652114888863578 \cdot 10^{112}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -1.74994020298687266 \cdot 10^{-290}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 1.2918788242355971 \cdot 10^{-219}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 1.20526441884369862 \cdot 10^{151}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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