Average Error: 32.1 → 18.6
Time: 1.4s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -5.9648958467837301 \cdot 10^{102}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le 2.3223338671593632 \cdot 10^{-278}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 9.7861409713485531 \cdot 10^{-239}:\\ \;\;\;\;\log re\\ \mathbf{elif}\;re \le 3.1269387827755257 \cdot 10^{72}:\\ \;\;\;\;\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 -5.9648958467837301 \cdot 10^{102}:\\
\;\;\;\;\log \left(-1 \cdot re\right)\\

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

\mathbf{elif}\;re \le 9.7861409713485531 \cdot 10^{-239}:\\
\;\;\;\;\log re\\

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

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

\end{array}
double f(double re, double im) {
        double r31524 = re;
        double r31525 = r31524 * r31524;
        double r31526 = im;
        double r31527 = r31526 * r31526;
        double r31528 = r31525 + r31527;
        double r31529 = sqrt(r31528);
        double r31530 = log(r31529);
        return r31530;
}

double f(double re, double im) {
        double r31531 = re;
        double r31532 = -5.96489584678373e+102;
        bool r31533 = r31531 <= r31532;
        double r31534 = -1.0;
        double r31535 = r31534 * r31531;
        double r31536 = log(r31535);
        double r31537 = 2.3223338671593632e-278;
        bool r31538 = r31531 <= r31537;
        double r31539 = r31531 * r31531;
        double r31540 = im;
        double r31541 = r31540 * r31540;
        double r31542 = r31539 + r31541;
        double r31543 = sqrt(r31542);
        double r31544 = log(r31543);
        double r31545 = 9.786140971348553e-239;
        bool r31546 = r31531 <= r31545;
        double r31547 = log(r31531);
        double r31548 = 3.1269387827755257e+72;
        bool r31549 = r31531 <= r31548;
        double r31550 = r31549 ? r31544 : r31547;
        double r31551 = r31546 ? r31547 : r31550;
        double r31552 = r31538 ? r31544 : r31551;
        double r31553 = r31533 ? r31536 : r31552;
        return r31553;
}

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 < -5.96489584678373e+102

    1. Initial program 53.0

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

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

    if -5.96489584678373e+102 < re < 2.3223338671593632e-278 or 9.786140971348553e-239 < re < 3.1269387827755257e+72

    1. Initial program 21.9

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

    if 2.3223338671593632e-278 < re < 9.786140971348553e-239 or 3.1269387827755257e+72 < re

    1. Initial program 45.5

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -5.9648958467837301 \cdot 10^{102}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le 2.3223338671593632 \cdot 10^{-278}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 9.7861409713485531 \cdot 10^{-239}:\\ \;\;\;\;\log re\\ \mathbf{elif}\;re \le 3.1269387827755257 \cdot 10^{72}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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