
(FPCore (re im) :precision binary64 (/ (log (sqrt (+ (* re re) (* im im)))) (log 10.0)))
double code(double re, double im) {
return log(sqrt(((re * re) + (im * im)))) / log(10.0);
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
code = log(sqrt(((re * re) + (im * im)))) / log(10.0d0)
end function
public static double code(double re, double im) {
return Math.log(Math.sqrt(((re * re) + (im * im)))) / Math.log(10.0);
}
def code(re, im): return math.log(math.sqrt(((re * re) + (im * im)))) / math.log(10.0)
function code(re, im) return Float64(log(sqrt(Float64(Float64(re * re) + Float64(im * im)))) / log(10.0)) end
function tmp = code(re, im) tmp = log(sqrt(((re * re) + (im * im)))) / log(10.0); end
code[re_, im_] := N[(N[Log[N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision] / N[Log[10.0], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\log \left(\sqrt{re \cdot re + im \cdot im}\right)}{\log 10}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (re im) :precision binary64 (/ (log (sqrt (+ (* re re) (* im im)))) (log 10.0)))
double code(double re, double im) {
return log(sqrt(((re * re) + (im * im)))) / log(10.0);
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
code = log(sqrt(((re * re) + (im * im)))) / log(10.0d0)
end function
public static double code(double re, double im) {
return Math.log(Math.sqrt(((re * re) + (im * im)))) / Math.log(10.0);
}
def code(re, im): return math.log(math.sqrt(((re * re) + (im * im)))) / math.log(10.0)
function code(re, im) return Float64(log(sqrt(Float64(Float64(re * re) + Float64(im * im)))) / log(10.0)) end
function tmp = code(re, im) tmp = log(sqrt(((re * re) + (im * im)))) / log(10.0); end
code[re_, im_] := N[(N[Log[N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision] / N[Log[10.0], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\log \left(\sqrt{re \cdot re + im \cdot im}\right)}{\log 10}
\end{array}
(FPCore (re im) :precision binary64 (log (pow (hypot re im) (pow (pow (log 10.0) -0.5) 2.0))))
double code(double re, double im) {
return log(pow(hypot(re, im), pow(pow(log(10.0), -0.5), 2.0)));
}
public static double code(double re, double im) {
return Math.log(Math.pow(Math.hypot(re, im), Math.pow(Math.pow(Math.log(10.0), -0.5), 2.0)));
}
def code(re, im): return math.log(math.pow(math.hypot(re, im), math.pow(math.pow(math.log(10.0), -0.5), 2.0)))
function code(re, im) return log((hypot(re, im) ^ ((log(10.0) ^ -0.5) ^ 2.0))) end
function tmp = code(re, im) tmp = log((hypot(re, im) ^ ((log(10.0) ^ -0.5) ^ 2.0))); end
code[re_, im_] := N[Log[N[Power[N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision], N[Power[N[Power[N[Log[10.0], $MachinePrecision], -0.5], $MachinePrecision], 2.0], $MachinePrecision]], $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
\log \left({\left(\mathsf{hypot}\left(re, im\right)\right)}^{\left({\left({\log 10}^{-0.5}\right)}^{2}\right)}\right)
\end{array}
Initial program 52.0%
hypot-def99.0%
Simplified99.0%
add-log-exp99.0%
div-inv98.6%
exp-to-pow98.5%
frac-2neg98.5%
metadata-eval98.5%
neg-log98.9%
metadata-eval98.9%
Applied egg-rr98.9%
metadata-eval98.9%
metadata-eval98.9%
neg-log98.5%
frac-2neg98.5%
metadata-eval98.5%
add-sqr-sqrt98.5%
frac-times99.8%
pow299.8%
inv-pow99.8%
sqrt-pow299.8%
metadata-eval99.8%
Applied egg-rr99.8%
Final simplification99.8%
(FPCore (re im) :precision binary64 (+ (+ 1.0 (/ (log (hypot re im)) (log 10.0))) -1.0))
double code(double re, double im) {
return (1.0 + (log(hypot(re, im)) / log(10.0))) + -1.0;
}
public static double code(double re, double im) {
return (1.0 + (Math.log(Math.hypot(re, im)) / Math.log(10.0))) + -1.0;
}
def code(re, im): return (1.0 + (math.log(math.hypot(re, im)) / math.log(10.0))) + -1.0
function code(re, im) return Float64(Float64(1.0 + Float64(log(hypot(re, im)) / log(10.0))) + -1.0) end
function tmp = code(re, im) tmp = (1.0 + (log(hypot(re, im)) / log(10.0))) + -1.0; end
code[re_, im_] := N[(N[(1.0 + N[(N[Log[N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision]], $MachinePrecision] / N[Log[10.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + -1.0), $MachinePrecision]
\begin{array}{l}
\\
\left(1 + \frac{\log \left(\mathsf{hypot}\left(re, im\right)\right)}{\log 10}\right) + -1
\end{array}
Initial program 52.0%
hypot-def99.0%
Simplified99.0%
expm1-log1p-u75.2%
expm1-udef75.2%
log1p-udef75.2%
add-exp-log99.0%
Applied egg-rr99.0%
Final simplification99.0%
(FPCore (re im) :precision binary64 (/ (log (hypot re im)) (log 10.0)))
double code(double re, double im) {
return log(hypot(re, im)) / log(10.0);
}
public static double code(double re, double im) {
return Math.log(Math.hypot(re, im)) / Math.log(10.0);
}
def code(re, im): return math.log(math.hypot(re, im)) / math.log(10.0)
function code(re, im) return Float64(log(hypot(re, im)) / log(10.0)) end
function tmp = code(re, im) tmp = log(hypot(re, im)) / log(10.0); end
code[re_, im_] := N[(N[Log[N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision]], $MachinePrecision] / N[Log[10.0], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\log \left(\mathsf{hypot}\left(re, im\right)\right)}{\log 10}
\end{array}
Initial program 52.0%
hypot-def99.0%
Simplified99.0%
Final simplification99.0%
(FPCore (re im) :precision binary64 (if (or (<= im 6e-90) (and (not (<= im 5.3e-48)) (<= im 0.072))) (/ 1.0 (/ (log1p 9.0) (log (- re)))) (/ (log im) (log 10.0))))
double code(double re, double im) {
double tmp;
if ((im <= 6e-90) || (!(im <= 5.3e-48) && (im <= 0.072))) {
tmp = 1.0 / (log1p(9.0) / log(-re));
} else {
tmp = log(im) / log(10.0);
}
return tmp;
}
public static double code(double re, double im) {
double tmp;
if ((im <= 6e-90) || (!(im <= 5.3e-48) && (im <= 0.072))) {
tmp = 1.0 / (Math.log1p(9.0) / Math.log(-re));
} else {
tmp = Math.log(im) / Math.log(10.0);
}
return tmp;
}
def code(re, im): tmp = 0 if (im <= 6e-90) or (not (im <= 5.3e-48) and (im <= 0.072)): tmp = 1.0 / (math.log1p(9.0) / math.log(-re)) else: tmp = math.log(im) / math.log(10.0) return tmp
function code(re, im) tmp = 0.0 if ((im <= 6e-90) || (!(im <= 5.3e-48) && (im <= 0.072))) tmp = Float64(1.0 / Float64(log1p(9.0) / log(Float64(-re)))); else tmp = Float64(log(im) / log(10.0)); end return tmp end
code[re_, im_] := If[Or[LessEqual[im, 6e-90], And[N[Not[LessEqual[im, 5.3e-48]], $MachinePrecision], LessEqual[im, 0.072]]], N[(1.0 / N[(N[Log[1 + 9.0], $MachinePrecision] / N[Log[(-re)], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[Log[im], $MachinePrecision] / N[Log[10.0], $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;im \leq 6 \cdot 10^{-90} \lor \neg \left(im \leq 5.3 \cdot 10^{-48}\right) \land im \leq 0.072:\\
\;\;\;\;\frac{1}{\frac{\mathsf{log1p}\left(9\right)}{\log \left(-re\right)}}\\
\mathbf{else}:\\
\;\;\;\;\frac{\log im}{\log 10}\\
\end{array}
\end{array}
if im < 6.00000000000000041e-90 or 5.3e-48 < im < 0.0719999999999999946Initial program 57.5%
hypot-def99.0%
Simplified99.0%
add-cbrt-cube99.0%
pow398.9%
Applied egg-rr98.9%
Taylor expanded in re around -inf 33.6%
associate-*r/33.6%
mul-1-neg33.6%
Simplified33.6%
rem-cbrt-cube33.7%
add-sqr-sqrt24.3%
sqrt-unprod25.9%
sqr-neg25.9%
sqrt-unprod1.5%
add-sqr-sqrt1.9%
clear-num1.9%
metadata-eval1.9%
metadata-eval1.9%
log1p-udef1.9%
metadata-eval1.9%
add-sqr-sqrt1.5%
sqrt-unprod25.9%
sqr-neg25.9%
sqrt-unprod24.3%
add-sqr-sqrt33.7%
neg-log33.7%
frac-2neg33.7%
metadata-eval33.7%
remove-double-div33.7%
Applied egg-rr33.7%
if 6.00000000000000041e-90 < im < 5.3e-48 or 0.0719999999999999946 < im Initial program 37.8%
hypot-def99.1%
Simplified99.1%
Taylor expanded in re around 0 79.9%
Final simplification46.7%
(FPCore (re im) :precision binary64 (if (or (<= im 1.08e-90) (and (not (<= im 2.6e-33)) (<= im 0.112))) (/ (log (/ -1.0 re)) (log 0.1)) (/ (log im) (log 10.0))))
double code(double re, double im) {
double tmp;
if ((im <= 1.08e-90) || (!(im <= 2.6e-33) && (im <= 0.112))) {
tmp = log((-1.0 / re)) / log(0.1);
} else {
tmp = log(im) / log(10.0);
}
return tmp;
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
real(8) :: tmp
if ((im <= 1.08d-90) .or. (.not. (im <= 2.6d-33)) .and. (im <= 0.112d0)) then
tmp = log(((-1.0d0) / re)) / log(0.1d0)
else
tmp = log(im) / log(10.0d0)
end if
code = tmp
end function
public static double code(double re, double im) {
double tmp;
if ((im <= 1.08e-90) || (!(im <= 2.6e-33) && (im <= 0.112))) {
tmp = Math.log((-1.0 / re)) / Math.log(0.1);
} else {
tmp = Math.log(im) / Math.log(10.0);
}
return tmp;
}
def code(re, im): tmp = 0 if (im <= 1.08e-90) or (not (im <= 2.6e-33) and (im <= 0.112)): tmp = math.log((-1.0 / re)) / math.log(0.1) else: tmp = math.log(im) / math.log(10.0) return tmp
function code(re, im) tmp = 0.0 if ((im <= 1.08e-90) || (!(im <= 2.6e-33) && (im <= 0.112))) tmp = Float64(log(Float64(-1.0 / re)) / log(0.1)); else tmp = Float64(log(im) / log(10.0)); end return tmp end
function tmp_2 = code(re, im) tmp = 0.0; if ((im <= 1.08e-90) || (~((im <= 2.6e-33)) && (im <= 0.112))) tmp = log((-1.0 / re)) / log(0.1); else tmp = log(im) / log(10.0); end tmp_2 = tmp; end
code[re_, im_] := If[Or[LessEqual[im, 1.08e-90], And[N[Not[LessEqual[im, 2.6e-33]], $MachinePrecision], LessEqual[im, 0.112]]], N[(N[Log[N[(-1.0 / re), $MachinePrecision]], $MachinePrecision] / N[Log[0.1], $MachinePrecision]), $MachinePrecision], N[(N[Log[im], $MachinePrecision] / N[Log[10.0], $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;im \leq 1.08 \cdot 10^{-90} \lor \neg \left(im \leq 2.6 \cdot 10^{-33}\right) \land im \leq 0.112:\\
\;\;\;\;\frac{\log \left(\frac{-1}{re}\right)}{\log 0.1}\\
\mathbf{else}:\\
\;\;\;\;\frac{\log im}{\log 10}\\
\end{array}
\end{array}
if im < 1.0799999999999999e-90 or 2.59999999999999994e-33 < im < 0.112000000000000002Initial program 57.3%
hypot-def99.0%
Simplified99.0%
div-inv98.6%
frac-2neg98.6%
metadata-eval98.6%
neg-log98.9%
metadata-eval98.9%
Applied egg-rr98.9%
*-commutative98.9%
associate-*l/99.0%
neg-mul-199.0%
Simplified99.0%
Taylor expanded in re around -inf 33.8%
if 1.0799999999999999e-90 < im < 2.59999999999999994e-33 or 0.112000000000000002 < im Initial program 38.6%
hypot-def99.1%
Simplified99.1%
Taylor expanded in re around 0 78.9%
Final simplification46.7%
(FPCore (re im) :precision binary64 (/ (log im) (log 0.1)))
double code(double re, double im) {
return log(im) / log(0.1);
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
code = log(im) / log(0.1d0)
end function
public static double code(double re, double im) {
return Math.log(im) / Math.log(0.1);
}
def code(re, im): return math.log(im) / math.log(0.1)
function code(re, im) return Float64(log(im) / log(0.1)) end
function tmp = code(re, im) tmp = log(im) / log(0.1); end
code[re_, im_] := N[(N[Log[im], $MachinePrecision] / N[Log[0.1], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\log im}{\log 0.1}
\end{array}
Initial program 52.0%
hypot-def99.0%
Simplified99.0%
Taylor expanded in re around 0 25.4%
frac-2neg25.4%
neg-log25.3%
metadata-eval25.3%
div-inv25.3%
Applied egg-rr25.3%
log-rec25.3%
associate-*r/25.3%
*-rgt-identity25.3%
log-rec25.3%
Simplified25.3%
add-sqr-sqrt4.9%
sqrt-unprod5.3%
sqr-neg5.3%
sqrt-unprod0.4%
*-un-lft-identity0.4%
times-frac0.4%
Applied egg-rr0.4%
/-rgt-identity0.4%
associate-*r/0.4%
rem-square-sqrt2.6%
Simplified2.6%
Final simplification2.6%
(FPCore (re im) :precision binary64 (/ (log im) (log 10.0)))
double code(double re, double im) {
return log(im) / log(10.0);
}
real(8) function code(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
code = log(im) / log(10.0d0)
end function
public static double code(double re, double im) {
return Math.log(im) / Math.log(10.0);
}
def code(re, im): return math.log(im) / math.log(10.0)
function code(re, im) return Float64(log(im) / log(10.0)) end
function tmp = code(re, im) tmp = log(im) / log(10.0); end
code[re_, im_] := N[(N[Log[im], $MachinePrecision] / N[Log[10.0], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\log im}{\log 10}
\end{array}
Initial program 52.0%
hypot-def99.0%
Simplified99.0%
Taylor expanded in re around 0 25.4%
Final simplification25.4%
herbie shell --seed 2023194
(FPCore (re im)
:name "math.log10 on complex, real part"
:precision binary64
(/ (log (sqrt (+ (* re re) (* im im)))) (log 10.0)))