Average Error: 31.2 → 17.7
Time: 3.1s
Precision: 64
\[\log \left(\sqrt{re \cdot re + im \cdot im}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le -1.372592495718595623920592719897374473902 \cdot 10^{113}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le -7.06955799813848965953437685478940011158 \cdot 10^{-161}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le -1.431461504135939896602399948892459534259 \cdot 10^{-195}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 9.191375807531116648978439416248974272723 \cdot 10^{-301}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 1.840587879824181703247471062292834004248 \cdot 10^{-175}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 6.594840577856811645577684374093823157435 \cdot 10^{73}:\\ \;\;\;\;\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.372592495718595623920592719897374473902 \cdot 10^{113}:\\
\;\;\;\;\log \left(-re\right)\\

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

\mathbf{elif}\;re \le -1.431461504135939896602399948892459534259 \cdot 10^{-195}:\\
\;\;\;\;\log im\\

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

\mathbf{elif}\;re \le 1.840587879824181703247471062292834004248 \cdot 10^{-175}:\\
\;\;\;\;\log im\\

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

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

\end{array}
double f(double re, double im) {
        double r95757 = re;
        double r95758 = r95757 * r95757;
        double r95759 = im;
        double r95760 = r95759 * r95759;
        double r95761 = r95758 + r95760;
        double r95762 = sqrt(r95761);
        double r95763 = log(r95762);
        return r95763;
}

double f(double re, double im) {
        double r95764 = re;
        double r95765 = -1.3725924957185956e+113;
        bool r95766 = r95764 <= r95765;
        double r95767 = -r95764;
        double r95768 = log(r95767);
        double r95769 = -7.06955799813849e-161;
        bool r95770 = r95764 <= r95769;
        double r95771 = r95764 * r95764;
        double r95772 = im;
        double r95773 = r95772 * r95772;
        double r95774 = r95771 + r95773;
        double r95775 = sqrt(r95774);
        double r95776 = log(r95775);
        double r95777 = -1.4314615041359399e-195;
        bool r95778 = r95764 <= r95777;
        double r95779 = log(r95772);
        double r95780 = 9.191375807531117e-301;
        bool r95781 = r95764 <= r95780;
        double r95782 = 1.8405878798241817e-175;
        bool r95783 = r95764 <= r95782;
        double r95784 = 6.594840577856812e+73;
        bool r95785 = r95764 <= r95784;
        double r95786 = log(r95764);
        double r95787 = r95785 ? r95776 : r95786;
        double r95788 = r95783 ? r95779 : r95787;
        double r95789 = r95781 ? r95776 : r95788;
        double r95790 = r95778 ? r95779 : r95789;
        double r95791 = r95770 ? r95776 : r95790;
        double r95792 = r95766 ? r95768 : r95791;
        return r95792;
}

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.3725924957185956e+113

    1. Initial program 53.4

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

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

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

    if -1.3725924957185956e+113 < re < -7.06955799813849e-161 or -1.4314615041359399e-195 < re < 9.191375807531117e-301 or 1.8405878798241817e-175 < re < 6.594840577856812e+73

    1. Initial program 19.0

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

    if -7.06955799813849e-161 < re < -1.4314615041359399e-195 or 9.191375807531117e-301 < re < 1.8405878798241817e-175

    1. Initial program 29.1

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

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

    if 6.594840577856812e+73 < re

    1. Initial program 48.0

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -1.372592495718595623920592719897374473902 \cdot 10^{113}:\\ \;\;\;\;\log \left(-re\right)\\ \mathbf{elif}\;re \le -7.06955799813848965953437685478940011158 \cdot 10^{-161}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le -1.431461504135939896602399948892459534259 \cdot 10^{-195}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 9.191375807531116648978439416248974272723 \cdot 10^{-301}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{elif}\;re \le 1.840587879824181703247471062292834004248 \cdot 10^{-175}:\\ \;\;\;\;\log im\\ \mathbf{elif}\;re \le 6.594840577856811645577684374093823157435 \cdot 10^{73}:\\ \;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\ \mathbf{else}:\\ \;\;\;\;\log re\\ \end{array}\]

Reproduce

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