Average Error: 32.0 → 18.1
Time: 1.6s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -8504444214849186820:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -1.94492286994368674 \cdot 10^{-227}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 1.67371517749345966 \cdot 10^{-296}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 1.23466046513203641 \cdot 10^{-75}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 1.3202809311828264 \cdot 10^{-48}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 4.2866910569424042 \cdot 10^{68}:\\ \;\;\;\;\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 -8504444214849186820:\\
\;\;\;\;\log \left(-1 \cdot re\right)\\

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

\mathbf{elif}\;re \le 1.67371517749345966 \cdot 10^{-296}:\\
\;\;\;\;\log im\\

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

\mathbf{elif}\;re \le 1.3202809311828264 \cdot 10^{-48}:\\
\;\;\;\;\log im\\

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

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

\end{array}
double f(double re, double im) {
        double r29540 = re;
        double r29541 = r29540 * r29540;
        double r29542 = im;
        double r29543 = r29542 * r29542;
        double r29544 = r29541 + r29543;
        double r29545 = sqrt(r29544);
        double r29546 = log(r29545);
        return r29546;
}

double f(double re, double im) {
        double r29547 = re;
        double r29548 = -8.504444214849187e+18;
        bool r29549 = r29547 <= r29548;
        double r29550 = -1.0;
        double r29551 = r29550 * r29547;
        double r29552 = log(r29551);
        double r29553 = -1.9449228699436867e-227;
        bool r29554 = r29547 <= r29553;
        double r29555 = r29547 * r29547;
        double r29556 = im;
        double r29557 = r29556 * r29556;
        double r29558 = r29555 + r29557;
        double r29559 = sqrt(r29558);
        double r29560 = log(r29559);
        double r29561 = 1.6737151774934597e-296;
        bool r29562 = r29547 <= r29561;
        double r29563 = log(r29556);
        double r29564 = 1.2346604651320364e-75;
        bool r29565 = r29547 <= r29564;
        double r29566 = 1.3202809311828264e-48;
        bool r29567 = r29547 <= r29566;
        double r29568 = 4.286691056942404e+68;
        bool r29569 = r29547 <= r29568;
        double r29570 = log(r29547);
        double r29571 = r29569 ? r29560 : r29570;
        double r29572 = r29567 ? r29563 : r29571;
        double r29573 = r29565 ? r29560 : r29572;
        double r29574 = r29562 ? r29563 : r29573;
        double r29575 = r29554 ? r29560 : r29574;
        double r29576 = r29549 ? r29552 : r29575;
        return r29576;
}

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 < -8.504444214849187e+18

    1. Initial program 42.5

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

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

    if -8.504444214849187e+18 < re < -1.9449228699436867e-227 or 1.6737151774934597e-296 < re < 1.2346604651320364e-75 or 1.3202809311828264e-48 < re < 4.286691056942404e+68

    1. Initial program 20.5

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

    if -1.9449228699436867e-227 < re < 1.6737151774934597e-296 or 1.2346604651320364e-75 < re < 1.3202809311828264e-48

    1. Initial program 28.5

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

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

    if 4.286691056942404e+68 < re

    1. Initial program 48.1

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -8504444214849186820:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -1.94492286994368674 \cdot 10^{-227}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 1.67371517749345966 \cdot 10^{-296}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 1.23466046513203641 \cdot 10^{-75}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 1.3202809311828264 \cdot 10^{-48}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 4.2866910569424042 \cdot 10^{68}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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