(FPCore (dl m l) :precision binary64 (* dl (log (/ m l))))
double code(double dl, double m, double l) { return dl * log((m / l)); }
real(8) function code(dl, m, l) real(8), intent (in) :: dl real(8), intent (in) :: m real(8), intent (in) :: l code = dl * log((m / l)) end function
public static double code(double dl, double m, double l) { return dl * Math.log((m / l)); }
def code(dl, m, l): return dl * math.log((m / l))
function code(dl, m, l) return Float64(dl * log(Float64(m / l))) end
function tmp = code(dl, m, l) tmp = dl * log((m / l)); end
code[dl_, m_, l_] := N[(dl * N[Log[N[(m / l), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l} \\ dl \cdot \log \left(\frac{m}{\ell}\right) \end{array}
Sampling outcomes in binary64 precision:
Herbie found 3 alternatives:
Alternative | Accuracy | Speedup |
---|
(FPCore (dl m l) :precision binary64 (* dl (log (/ m l))))
double code(double dl, double m, double l) { return dl * log((m / l)); }
real(8) function code(dl, m, l) real(8), intent (in) :: dl real(8), intent (in) :: m real(8), intent (in) :: l code = dl * log((m / l)) end function
public static double code(double dl, double m, double l) { return dl * Math.log((m / l)); }
def code(dl, m, l): return dl * math.log((m / l))
function code(dl, m, l) return Float64(dl * log(Float64(m / l))) end
function tmp = code(dl, m, l) tmp = dl * log((m / l)); end
code[dl_, m_, l_] := N[(dl * N[Log[N[(m / l), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l} \\ dl \cdot \log \left(\frac{m}{\ell}\right) \end{array}
(FPCore (dl m l) :precision binary64 (if (<= l -2e-310) (* dl (- (log (- m)) (log (- l)))) (* dl (- (log m) (log l)))))
double code(double dl, double m, double l) { double tmp; if (l <= -2e-310) { tmp = dl * (log(-m) - log(-l)); } else { tmp = dl * (log(m) - log(l)); } return tmp; }
real(8) function code(dl, m, l) real(8), intent (in) :: dl real(8), intent (in) :: m real(8), intent (in) :: l real(8) :: tmp if (l <= (-2d-310)) then tmp = dl * (log(-m) - log(-l)) else tmp = dl * (log(m) - log(l)) end if code = tmp end function
public static double code(double dl, double m, double l) { double tmp; if (l <= -2e-310) { tmp = dl * (Math.log(-m) - Math.log(-l)); } else { tmp = dl * (Math.log(m) - Math.log(l)); } return tmp; }
def code(dl, m, l): tmp = 0 if l <= -2e-310: tmp = dl * (math.log(-m) - math.log(-l)) else: tmp = dl * (math.log(m) - math.log(l)) return tmp
function code(dl, m, l) tmp = 0.0 if (l <= -2e-310) tmp = Float64(dl * Float64(log(Float64(-m)) - log(Float64(-l)))); else tmp = Float64(dl * Float64(log(m) - log(l))); end return tmp end
function tmp_2 = code(dl, m, l) tmp = 0.0; if (l <= -2e-310) tmp = dl * (log(-m) - log(-l)); else tmp = dl * (log(m) - log(l)); end tmp_2 = tmp; end
code[dl_, m_, l_] := If[LessEqual[l, -2e-310], N[(dl * N[(N[Log[(-m)], $MachinePrecision] - N[Log[(-l)], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(dl * N[(N[Log[m], $MachinePrecision] - N[Log[l], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;\ell \leq -2 \cdot 10^{-310}:\\ \;\;\;\;dl \cdot \left(\log \left(-m\right) - \log \left(-\ell\right)\right)\\ \mathbf{else}:\\ \;\;\;\;dl \cdot \left(\log m - \log \ell\right)\\ \end{array} \end{array}
if l < -1.999999999999994e-310
Initial program 74.5%
clear-num
N/A
log-rec
N/A
distribute-rgt-neg-out
N/A
distribute-lft-neg-in
N/A
*-lowering-*.f64
N/A
neg-lowering-neg.f64
N/A
clear-num
N/A
frac-2neg
N/A
div-inv
N/A
associate-/r*
N/A
inv-pow
N/A
sqr-pow
N/A
unpow-prod-down
N/A
sqr-neg
N/A
pow-prod-down
N/A
sqr-pow
N/A
inv-pow
N/A
associate-/r*
N/A
div-inv
N/A
clear-num
N/A
distribute-neg-frac2
N/A
log-lowering-log.f64
N/A
distribute-neg-frac
N/A
clear-num
N/A
Applied egg-rr73.3%
frac-2neg
N/A
log-div
N/A
--lowering--.f64
N/A
log-lowering-log.f64
N/A
neg-lowering-neg.f64
N/A
log-lowering-log.f64
N/A
neg-lowering-neg.f64
99.0
Applied egg-rr99.0%
if -1.999999999999994e-310 < l
Initial program 71.9%
log-div
N/A
--lowering--.f64
N/A
log-lowering-log.f64
N/A
log-lowering-log.f64
99.2
Applied egg-rr99.2%
Final simplification99.1%
(FPCore (dl m l) :precision binary64 (if (<= l 3.25e-302) (* dl (log (/ m l))) (* dl (- (log m) (log l)))))
double code(double dl, double m, double l) { double tmp; if (l <= 3.25e-302) { tmp = dl * log((m / l)); } else { tmp = dl * (log(m) - log(l)); } return tmp; }
real(8) function code(dl, m, l) real(8), intent (in) :: dl real(8), intent (in) :: m real(8), intent (in) :: l real(8) :: tmp if (l <= 3.25d-302) then tmp = dl * log((m / l)) else tmp = dl * (log(m) - log(l)) end if code = tmp end function
public static double code(double dl, double m, double l) { double tmp; if (l <= 3.25e-302) { tmp = dl * Math.log((m / l)); } else { tmp = dl * (Math.log(m) - Math.log(l)); } return tmp; }
def code(dl, m, l): tmp = 0 if l <= 3.25e-302: tmp = dl * math.log((m / l)) else: tmp = dl * (math.log(m) - math.log(l)) return tmp
function code(dl, m, l) tmp = 0.0 if (l <= 3.25e-302) tmp = Float64(dl * log(Float64(m / l))); else tmp = Float64(dl * Float64(log(m) - log(l))); end return tmp end
function tmp_2 = code(dl, m, l) tmp = 0.0; if (l <= 3.25e-302) tmp = dl * log((m / l)); else tmp = dl * (log(m) - log(l)); end tmp_2 = tmp; end
code[dl_, m_, l_] := If[LessEqual[l, 3.25e-302], N[(dl * N[Log[N[(m / l), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(dl * N[(N[Log[m], $MachinePrecision] - N[Log[l], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;\ell \leq 3.25 \cdot 10^{-302}:\\ \;\;\;\;dl \cdot \log \left(\frac{m}{\ell}\right)\\ \mathbf{else}:\\ \;\;\;\;dl \cdot \left(\log m - \log \ell\right)\\ \end{array} \end{array}
if l < 3.2499999999999997e-302
Initial program 74.7%
if 3.2499999999999997e-302 < l
Initial program 71.7%
log-div
N/A
--lowering--.f64
N/A
log-lowering-log.f64
N/A
log-lowering-log.f64
99.2
Applied egg-rr99.2%
(FPCore (dl m l) :precision binary64 (* dl (log (/ m l))))
double code(double dl, double m, double l) { return dl * log((m / l)); }
real(8) function code(dl, m, l) real(8), intent (in) :: dl real(8), intent (in) :: m real(8), intent (in) :: l code = dl * log((m / l)) end function
public static double code(double dl, double m, double l) { return dl * Math.log((m / l)); }
def code(dl, m, l): return dl * math.log((m / l))
function code(dl, m, l) return Float64(dl * log(Float64(m / l))) end
function tmp = code(dl, m, l) tmp = dl * log((m / l)); end
code[dl_, m_, l_] := N[(dl * N[Log[N[(m / l), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l} \\ dl \cdot \log \left(\frac{m}{\ell}\right) \end{array}
Initial program 73.3%
herbie shell --seed 5
(FPCore (dl m l)
:name "dl*log(m/l)"
:precision binary64
(* dl (log (/ m l))))