Average Error: 31.7 → 17.2
Time: 2.6s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -2.946183191908406671595100469745271073119 \cdot 10^{133}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 8.784777781274209269646820478692496812361 \cdot 10^{62}:\\ \;\;\;\;\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 -2.946183191908406671595100469745271073119 \cdot 10^{133}:\\
\;\;\;\;\log \left(-re\right)\\

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

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

\end{array}
double f(double re, double im) {
        double r93968 = re;
        double r93969 = r93968 * r93968;
        double r93970 = im;
        double r93971 = r93970 * r93970;
        double r93972 = r93969 + r93971;
        double r93973 = sqrt(r93972);
        double r93974 = log(r93973);
        return r93974;
}

double f(double re, double im) {
        double r93975 = re;
        double r93976 = -2.9461831919084067e+133;
        bool r93977 = r93975 <= r93976;
        double r93978 = -r93975;
        double r93979 = log(r93978);
        double r93980 = 8.78477778127421e+62;
        bool r93981 = r93975 <= r93980;
        double r93982 = r93975 * r93975;
        double r93983 = im;
        double r93984 = r93983 * r93983;
        double r93985 = r93982 + r93984;
        double r93986 = sqrt(r93985);
        double r93987 = log(r93986);
        double r93988 = log(r93975);
        double r93989 = r93981 ? r93987 : r93988;
        double r93990 = r93977 ? r93979 : r93989;
        return r93990;
}

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 < -2.9461831919084067e+133

    1. Initial program 58.1

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

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

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

    if -2.9461831919084067e+133 < re < 8.78477778127421e+62

    1. Initial program 21.6

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

    if 8.78477778127421e+62 < re

    1. Initial program 45.8

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -2.946183191908406671595100469745271073119 \cdot 10^{133}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le 8.784777781274209269646820478692496812361 \cdot 10^{62}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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