
(FPCore (a b) :precision binary64 :pre TRUE (exp (+ (log a) (log b))))
double code(double a, double b) {
return exp((log(a) + log(b)));
}
real(8) function code(a, b)
use fmin_fmax_functions
real(8), intent (in) :: a
real(8), intent (in) :: b
code = exp((log(a) + log(b)))
end function
public static double code(double a, double b) {
return Math.exp((Math.log(a) + Math.log(b)));
}
def code(a, b): return math.exp((math.log(a) + math.log(b)))
function code(a, b) return exp(Float64(log(a) + log(b))) end
function tmp = code(a, b) tmp = exp((log(a) + log(b))); end
code[a_, b_] := N[Exp[N[(N[Log[a], $MachinePrecision] + N[Log[b], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
f(a, b): a in [-inf, +inf], b in [-inf, +inf] code: THEORY BEGIN f(a, b: real): real = exp(((ln(a)) + (ln(b)))) END code
e^{\log a + \log b}
Herbie found 1 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (a b) :precision binary64 :pre TRUE (exp (+ (log a) (log b))))
double code(double a, double b) {
return exp((log(a) + log(b)));
}
real(8) function code(a, b)
use fmin_fmax_functions
real(8), intent (in) :: a
real(8), intent (in) :: b
code = exp((log(a) + log(b)))
end function
public static double code(double a, double b) {
return Math.exp((Math.log(a) + Math.log(b)));
}
def code(a, b): return math.exp((math.log(a) + math.log(b)))
function code(a, b) return exp(Float64(log(a) + log(b))) end
function tmp = code(a, b) tmp = exp((log(a) + log(b))); end
code[a_, b_] := N[Exp[N[(N[Log[a], $MachinePrecision] + N[Log[b], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
f(a, b): a in [-inf, +inf], b in [-inf, +inf] code: THEORY BEGIN f(a, b: real): real = exp(((ln(a)) + (ln(b)))) END code
e^{\log a + \log b}
(FPCore (a b) :precision binary64 :pre TRUE (* b a))
double code(double a, double b) {
return b * a;
}
real(8) function code(a, b)
use fmin_fmax_functions
real(8), intent (in) :: a
real(8), intent (in) :: b
code = b * a
end function
public static double code(double a, double b) {
return b * a;
}
def code(a, b): return b * a
function code(a, b) return Float64(b * a) end
function tmp = code(a, b) tmp = b * a; end
code[a_, b_] := N[(b * a), $MachinePrecision]
f(a, b): a in [-inf, +inf], b in [-inf, +inf] code: THEORY BEGIN f(a, b: real): real = b * a END code
b \cdot a
Initial program 92.2%
lift-exp.f64N/A
lift-+.f64N/A
lift-log.f64N/A
lift-log.f64N/A
sum-logN/A
rem-exp-logN/A
*-commutativeN/A
lower-*.f64100.0%
Applied rewrites100.0%
(FPCore (a b) :precision binary64 :pre TRUE (* a b))
double code(double a, double b) {
return a * b;
}
real(8) function code(a, b)
use fmin_fmax_functions
real(8), intent (in) :: a
real(8), intent (in) :: b
code = a * b
end function
public static double code(double a, double b) {
return a * b;
}
def code(a, b): return a * b
function code(a, b) return Float64(a * b) end
function tmp = code(a, b) tmp = a * b; end
code[a_, b_] := N[(a * b), $MachinePrecision]
f(a, b): a in [-inf, +inf], b in [-inf, +inf] code: THEORY BEGIN f(a, b: real): real = a * b END code
a \cdot b
herbie shell --seed 2025355
(FPCore (a b)
:name "Exp of sum of logs"
:precision binary64
:alt
(! :herbie-platform c (* a b))
(exp (+ (log a) (log b))))