Average Error: 31.6 → 18.0
Time: 1.2s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -5.1853738157433311 \cdot 10^{115}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -3.2322001606130373 \cdot 10^{-152}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 3.3264901232199245 \cdot 10^{-273}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 2.97128001067495674 \cdot 10^{26}:\\ \;\;\;\;\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.1853738157433311 \cdot 10^{115}:\\
\;\;\;\;\log \left(-1 \cdot re\right)\\

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

\mathbf{elif}\;re \le 3.3264901232199245 \cdot 10^{-273}:\\
\;\;\;\;\log im\\

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

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

\end{array}
double f(double re, double im) {
        double r34149 = re;
        double r34150 = r34149 * r34149;
        double r34151 = im;
        double r34152 = r34151 * r34151;
        double r34153 = r34150 + r34152;
        double r34154 = sqrt(r34153);
        double r34155 = log(r34154);
        return r34155;
}

double f(double re, double im) {
        double r34156 = re;
        double r34157 = -5.185373815743331e+115;
        bool r34158 = r34156 <= r34157;
        double r34159 = -1.0;
        double r34160 = r34159 * r34156;
        double r34161 = log(r34160);
        double r34162 = -3.2322001606130373e-152;
        bool r34163 = r34156 <= r34162;
        double r34164 = r34156 * r34156;
        double r34165 = im;
        double r34166 = r34165 * r34165;
        double r34167 = r34164 + r34166;
        double r34168 = sqrt(r34167);
        double r34169 = log(r34168);
        double r34170 = 3.3264901232199245e-273;
        bool r34171 = r34156 <= r34170;
        double r34172 = log(r34165);
        double r34173 = 2.9712800106749567e+26;
        bool r34174 = r34156 <= r34173;
        double r34175 = log(r34156);
        double r34176 = r34174 ? r34169 : r34175;
        double r34177 = r34171 ? r34172 : r34176;
        double r34178 = r34163 ? r34169 : r34177;
        double r34179 = r34158 ? r34161 : r34178;
        return r34179;
}

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 < -5.185373815743331e+115

    1. Initial program 54.1

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

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

    if -5.185373815743331e+115 < re < -3.2322001606130373e-152 or 3.3264901232199245e-273 < re < 2.9712800106749567e+26

    1. Initial program 18.9

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

    if -3.2322001606130373e-152 < re < 3.3264901232199245e-273

    1. Initial program 30.3

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

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

    if 2.9712800106749567e+26 < re

    1. Initial program 42.2

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -5.1853738157433311 \cdot 10^{115}:\\ \;\;\;\;\log \left(-1 \cdot re\right)\\ \mathbf{elif}\;re \le -3.2322001606130373 \cdot 10^{-152}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 3.3264901232199245 \cdot 10^{-273}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 2.97128001067495674 \cdot 10^{26}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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