Average Error: 32.4 → 18.1
Time: 1.2s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -1.012696922971656070126551128339768331018 \cdot 10^{144}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -8.463201405765729115322317591242469230422 \cdot 10^{-144}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le -3.068368918555544922720895417815131992438 \cdot 10^{-192}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 3.162005679260343971879420197094042200479 \cdot 10^{70}:\\ \;\;\;\;\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 -1.012696922971656070126551128339768331018 \cdot 10^{144}:\\
\;\;\;\;\log \left(-1 \cdot re\right)\\

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

\mathbf{elif}\;re \le -3.068368918555544922720895417815131992438 \cdot 10^{-192}:\\
\;\;\;\;\log im\\

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

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

\end{array}
double f(double re, double im) {
        double r27925 = re;
        double r27926 = r27925 * r27925;
        double r27927 = im;
        double r27928 = r27927 * r27927;
        double r27929 = r27926 + r27928;
        double r27930 = sqrt(r27929);
        double r27931 = log(r27930);
        return r27931;
}

double f(double re, double im) {
        double r27932 = re;
        double r27933 = -1.012696922971656e+144;
        bool r27934 = r27932 <= r27933;
        double r27935 = -1.0;
        double r27936 = r27935 * r27932;
        double r27937 = log(r27936);
        double r27938 = -8.463201405765729e-144;
        bool r27939 = r27932 <= r27938;
        double r27940 = r27932 * r27932;
        double r27941 = im;
        double r27942 = r27941 * r27941;
        double r27943 = r27940 + r27942;
        double r27944 = sqrt(r27943);
        double r27945 = log(r27944);
        double r27946 = -3.068368918555545e-192;
        bool r27947 = r27932 <= r27946;
        double r27948 = log(r27941);
        double r27949 = 3.162005679260344e+70;
        bool r27950 = r27932 <= r27949;
        double r27951 = log(r27932);
        double r27952 = r27950 ? r27945 : r27951;
        double r27953 = r27947 ? r27948 : r27952;
        double r27954 = r27939 ? r27945 : r27953;
        double r27955 = r27934 ? r27937 : r27954;
        return r27955;
}

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 < -1.012696922971656e+144

    1. Initial program 60.8

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

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

    if -1.012696922971656e+144 < re < -8.463201405765729e-144 or -3.068368918555545e-192 < re < 3.162005679260344e+70

    1. Initial program 21.6

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

    if -8.463201405765729e-144 < re < -3.068368918555545e-192

    1. Initial program 27.0

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

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

    if 3.162005679260344e+70 < 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 -1.012696922971656070126551128339768331018 \cdot 10^{144}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -8.463201405765729115322317591242469230422 \cdot 10^{-144}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le -3.068368918555544922720895417815131992438 \cdot 10^{-192}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 3.162005679260343971879420197094042200479 \cdot 10^{70}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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