| Alternative 1 | |
|---|---|
| Error | 10.0 |
| Cost | 6660 |
\[\begin{array}{l}
\mathbf{if}\;im \leq 7.5 \cdot 10^{-97}:\\
\;\;\;\;\log \left(-re\right)\\
\mathbf{else}:\\
\;\;\;\;\log im\\
\end{array}
\]
(FPCore (re im) :precision binary64 (log (sqrt (+ (* re re) (* im im)))))
(FPCore (re im) :precision binary64 (if (<= im 1.05e-165) (log (- re)) (if (<= im 4.3e+98) (log (sqrt (+ (* re re) (* im im)))) (log im))))
double code(double re, double im) {
return log(sqrt(((re * re) + (im * im))));
}
double code(double re, double im) {
double tmp;
if (im <= 1.05e-165) {
tmp = log(-re);
} else if (im <= 4.3e+98) {
tmp = log(sqrt(((re * re) + (im * im))));
} else {
tmp = log(im);
}
return tmp;
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
code = log(sqrt(((re * re) + (im * im))))
end function
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: tmp
if (im <= 1.05d-165) then
tmp = log(-re)
else if (im <= 4.3d+98) then
tmp = log(sqrt(((re * re) + (im * im))))
else
tmp = log(im)
end if
code = tmp
end function
public static double code(double re, double im) {
return Math.log(Math.sqrt(((re * re) + (im * im))));
}
public static double code(double re, double im) {
double tmp;
if (im <= 1.05e-165) {
tmp = Math.log(-re);
} else if (im <= 4.3e+98) {
tmp = Math.log(Math.sqrt(((re * re) + (im * im))));
} else {
tmp = Math.log(im);
}
return tmp;
}
def code(re, im): return math.log(math.sqrt(((re * re) + (im * im))))
def code(re, im): tmp = 0 if im <= 1.05e-165: tmp = math.log(-re) elif im <= 4.3e+98: tmp = math.log(math.sqrt(((re * re) + (im * im)))) else: tmp = math.log(im) return tmp
function code(re, im) return log(sqrt(Float64(Float64(re * re) + Float64(im * im)))) end
function code(re, im) tmp = 0.0 if (im <= 1.05e-165) tmp = log(Float64(-re)); elseif (im <= 4.3e+98) tmp = log(sqrt(Float64(Float64(re * re) + Float64(im * im)))); else tmp = log(im); end return tmp end
function tmp = code(re, im) tmp = log(sqrt(((re * re) + (im * im)))); end
function tmp_2 = code(re, im) tmp = 0.0; if (im <= 1.05e-165) tmp = log(-re); elseif (im <= 4.3e+98) tmp = log(sqrt(((re * re) + (im * im)))); else tmp = log(im); end tmp_2 = tmp; end
code[re_, im_] := N[Log[N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]
code[re_, im_] := If[LessEqual[im, 1.05e-165], N[Log[(-re)], $MachinePrecision], If[LessEqual[im, 4.3e+98], N[Log[N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision], N[Log[im], $MachinePrecision]]]
\log \left(\sqrt{re \cdot re + im \cdot im}\right)
\begin{array}{l}
\mathbf{if}\;im \leq 1.05 \cdot 10^{-165}:\\
\;\;\;\;\log \left(-re\right)\\
\mathbf{elif}\;im \leq 4.3 \cdot 10^{+98}:\\
\;\;\;\;\log \left(\sqrt{re \cdot re + im \cdot im}\right)\\
\mathbf{else}:\\
\;\;\;\;\log im\\
\end{array}
Results
if im < 1.04999999999999997e-165Initial program 32.8
Taylor expanded in re around -inf 4.9
Simplified4.9
[Start]4.9 | \[ \log \left(-1 \cdot re\right)
\] |
|---|---|
rational.json-simplify-2 [=>]4.9 | \[ \log \color{blue}{\left(re \cdot -1\right)}
\] |
rational.json-simplify-8 [<=]4.9 | \[ \log \color{blue}{\left(-re\right)}
\] |
if 1.04999999999999997e-165 < im < 4.3000000000000001e98Initial program 12.5
if 4.3000000000000001e98 < im Initial program 49.9
Taylor expanded in re around 0 5.4
Final simplification7.4
| Alternative 1 | |
|---|---|
| Error | 10.0 |
| Cost | 6660 |
| Alternative 2 | |
|---|---|
| Error | 30.8 |
| Cost | 6464 |
herbie shell --seed 2023077
(FPCore (re im)
:name "math.log/1 on complex, real part"
:precision binary64
(log (sqrt (+ (* re re) (* im im)))))