
(FPCore (U ArB) :precision binary64 :pre TRUE (* 0.5 (* ArB (log (/ (- 1.0 U) (+ 1.0 U))))))
double code(double U, double ArB) {
return 0.5 * (ArB * log(((1.0 - U) / (1.0 + U))));
}
real(8) function code(u, arb)
use fmin_fmax_functions
real(8), intent (in) :: u
real(8), intent (in) :: arb
code = 0.5d0 * (arb * log(((1.0d0 - u) / (1.0d0 + u))))
end function
public static double code(double U, double ArB) {
return 0.5 * (ArB * Math.log(((1.0 - U) / (1.0 + U))));
}
def code(U, ArB): return 0.5 * (ArB * math.log(((1.0 - U) / (1.0 + U))))
function code(U, ArB) return Float64(0.5 * Float64(ArB * log(Float64(Float64(1.0 - U) / Float64(1.0 + U))))) end
function tmp = code(U, ArB) tmp = 0.5 * (ArB * log(((1.0 - U) / (1.0 + U)))); end
code[U_, ArB_] := N[(0.5 * N[(ArB * N[Log[N[(N[(1.0 - U), $MachinePrecision] / N[(1.0 + U), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = (5e-1) * (ArB * (ln((((1) - U) / ((1) + U))))) END code
0.5 \cdot \left(ArB \cdot \log \left(\frac{1 - U}{1 + U}\right)\right)
Herbie found 8 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (U ArB) :precision binary64 :pre TRUE (* 0.5 (* ArB (log (/ (- 1.0 U) (+ 1.0 U))))))
double code(double U, double ArB) {
return 0.5 * (ArB * log(((1.0 - U) / (1.0 + U))));
}
real(8) function code(u, arb)
use fmin_fmax_functions
real(8), intent (in) :: u
real(8), intent (in) :: arb
code = 0.5d0 * (arb * log(((1.0d0 - u) / (1.0d0 + u))))
end function
public static double code(double U, double ArB) {
return 0.5 * (ArB * Math.log(((1.0 - U) / (1.0 + U))));
}
def code(U, ArB): return 0.5 * (ArB * math.log(((1.0 - U) / (1.0 + U))))
function code(U, ArB) return Float64(0.5 * Float64(ArB * log(Float64(Float64(1.0 - U) / Float64(1.0 + U))))) end
function tmp = code(U, ArB) tmp = 0.5 * (ArB * log(((1.0 - U) / (1.0 + U)))); end
code[U_, ArB_] := N[(0.5 * N[(ArB * N[Log[N[(N[(1.0 - U), $MachinePrecision] / N[(1.0 + U), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = (5e-1) * (ArB * (ln((((1) - U) / ((1) + U))))) END code
0.5 \cdot \left(ArB \cdot \log \left(\frac{1 - U}{1 + U}\right)\right)
(FPCore (U ArB)
:precision binary64
:pre TRUE
(*
(-
(*
(* U U)
(*
(fma
(fma -0.14285714285714285 (* U U) -0.2)
(* U U)
-0.3333333333333333)
ArB))
ArB)
U))double code(double U, double ArB) {
return (((U * U) * (fma(fma(-0.14285714285714285, (U * U), -0.2), (U * U), -0.3333333333333333) * ArB)) - ArB) * U;
}
function code(U, ArB) return Float64(Float64(Float64(Float64(U * U) * Float64(fma(fma(-0.14285714285714285, Float64(U * U), -0.2), Float64(U * U), -0.3333333333333333) * ArB)) - ArB) * U) end
code[U_, ArB_] := N[(N[(N[(N[(U * U), $MachinePrecision] * N[(N[(N[(-0.14285714285714285 * N[(U * U), $MachinePrecision] + -0.2), $MachinePrecision] * N[(U * U), $MachinePrecision] + -0.3333333333333333), $MachinePrecision] * ArB), $MachinePrecision]), $MachinePrecision] - ArB), $MachinePrecision] * U), $MachinePrecision]
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = (((U * U) * ((((((-142857142857142849212692681248881854116916656494140625e-54) * (U * U)) + (-200000000000000011102230246251565404236316680908203125e-54)) * (U * U)) + (-333333333333333314829616256247390992939472198486328125e-54)) * ArB)) - ArB) * U END code
\left(\left(U \cdot U\right) \cdot \left(\mathsf{fma}\left(\mathsf{fma}\left(-0.14285714285714285, U \cdot U, -0.2\right), U \cdot U, -0.3333333333333333\right) \cdot ArB\right) - ArB\right) \cdot U
Initial program 30.5%
Taylor expanded in U around 0
Applied rewrites99.7%
Applied rewrites99.7%
Applied rewrites99.7%
(FPCore (U ArB)
:precision binary64
:pre TRUE
(*
(*
ArB
(fma
(fma
(fma -0.14285714285714285 (* U U) -0.2)
(* U U)
-0.3333333333333333)
(* U U)
-1.0))
U))double code(double U, double ArB) {
return (ArB * fma(fma(fma(-0.14285714285714285, (U * U), -0.2), (U * U), -0.3333333333333333), (U * U), -1.0)) * U;
}
function code(U, ArB) return Float64(Float64(ArB * fma(fma(fma(-0.14285714285714285, Float64(U * U), -0.2), Float64(U * U), -0.3333333333333333), Float64(U * U), -1.0)) * U) end
code[U_, ArB_] := N[(N[(ArB * N[(N[(N[(-0.14285714285714285 * N[(U * U), $MachinePrecision] + -0.2), $MachinePrecision] * N[(U * U), $MachinePrecision] + -0.3333333333333333), $MachinePrecision] * N[(U * U), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision] * U), $MachinePrecision]
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = (ArB * (((((((-142857142857142849212692681248881854116916656494140625e-54) * (U * U)) + (-200000000000000011102230246251565404236316680908203125e-54)) * (U * U)) + (-333333333333333314829616256247390992939472198486328125e-54)) * (U * U)) + (-1))) * U END code
\left(ArB \cdot \mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(-0.14285714285714285, U \cdot U, -0.2\right), U \cdot U, -0.3333333333333333\right), U \cdot U, -1\right)\right) \cdot U
Initial program 30.5%
Taylor expanded in U around 0
Applied rewrites99.7%
Applied rewrites99.7%
Applied rewrites99.7%
Applied rewrites99.7%
(FPCore (U ArB) :precision binary64 :pre TRUE (* (- (* (* U U) (* (fma -0.2 (* U U) -0.3333333333333333) ArB)) ArB) U))
double code(double U, double ArB) {
return (((U * U) * (fma(-0.2, (U * U), -0.3333333333333333) * ArB)) - ArB) * U;
}
function code(U, ArB) return Float64(Float64(Float64(Float64(U * U) * Float64(fma(-0.2, Float64(U * U), -0.3333333333333333) * ArB)) - ArB) * U) end
code[U_, ArB_] := N[(N[(N[(N[(U * U), $MachinePrecision] * N[(N[(-0.2 * N[(U * U), $MachinePrecision] + -0.3333333333333333), $MachinePrecision] * ArB), $MachinePrecision]), $MachinePrecision] - ArB), $MachinePrecision] * U), $MachinePrecision]
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = (((U * U) * ((((-200000000000000011102230246251565404236316680908203125e-54) * (U * U)) + (-333333333333333314829616256247390992939472198486328125e-54)) * ArB)) - ArB) * U END code
\left(\left(U \cdot U\right) \cdot \left(\mathsf{fma}\left(-0.2, U \cdot U, -0.3333333333333333\right) \cdot ArB\right) - ArB\right) \cdot U
Initial program 30.5%
Taylor expanded in U around 0
Applied rewrites99.7%
Applied rewrites99.7%
Applied rewrites99.7%
Taylor expanded in U around 0
Applied rewrites99.6%
(FPCore (U ArB) :precision binary64 :pre TRUE (- (* (* (* U U) U) (* -0.3333333333333333 ArB)) (* ArB U)))
double code(double U, double ArB) {
return (((U * U) * U) * (-0.3333333333333333 * ArB)) - (ArB * U);
}
real(8) function code(u, arb)
use fmin_fmax_functions
real(8), intent (in) :: u
real(8), intent (in) :: arb
code = (((u * u) * u) * ((-0.3333333333333333d0) * arb)) - (arb * u)
end function
public static double code(double U, double ArB) {
return (((U * U) * U) * (-0.3333333333333333 * ArB)) - (ArB * U);
}
def code(U, ArB): return (((U * U) * U) * (-0.3333333333333333 * ArB)) - (ArB * U)
function code(U, ArB) return Float64(Float64(Float64(Float64(U * U) * U) * Float64(-0.3333333333333333 * ArB)) - Float64(ArB * U)) end
function tmp = code(U, ArB) tmp = (((U * U) * U) * (-0.3333333333333333 * ArB)) - (ArB * U); end
code[U_, ArB_] := N[(N[(N[(N[(U * U), $MachinePrecision] * U), $MachinePrecision] * N[(-0.3333333333333333 * ArB), $MachinePrecision]), $MachinePrecision] - N[(ArB * U), $MachinePrecision]), $MachinePrecision]
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = (((U * U) * U) * ((-333333333333333314829616256247390992939472198486328125e-54) * ArB)) - (ArB * U) END code
\left(\left(U \cdot U\right) \cdot U\right) \cdot \left(-0.3333333333333333 \cdot ArB\right) - ArB \cdot U
Initial program 30.5%
Taylor expanded in U around 0
Applied rewrites99.5%
Applied rewrites99.5%
(FPCore (U ArB) :precision binary64 :pre TRUE (* (fma -0.3333333333333333 (* U U) -1.0) (* ArB U)))
double code(double U, double ArB) {
return fma(-0.3333333333333333, (U * U), -1.0) * (ArB * U);
}
function code(U, ArB) return Float64(fma(-0.3333333333333333, Float64(U * U), -1.0) * Float64(ArB * U)) end
code[U_, ArB_] := N[(N[(-0.3333333333333333 * N[(U * U), $MachinePrecision] + -1.0), $MachinePrecision] * N[(ArB * U), $MachinePrecision]), $MachinePrecision]
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = (((-333333333333333314829616256247390992939472198486328125e-54) * (U * U)) + (-1)) * (ArB * U) END code
\mathsf{fma}\left(-0.3333333333333333, U \cdot U, -1\right) \cdot \left(ArB \cdot U\right)
Initial program 30.5%
Taylor expanded in U around 0
Applied rewrites99.5%
Applied rewrites99.5%
Applied rewrites99.5%
(FPCore (U ArB) :precision binary64 :pre TRUE (* U (* ArB (fma -0.3333333333333333 (* U U) -1.0))))
double code(double U, double ArB) {
return U * (ArB * fma(-0.3333333333333333, (U * U), -1.0));
}
function code(U, ArB) return Float64(U * Float64(ArB * fma(-0.3333333333333333, Float64(U * U), -1.0))) end
code[U_, ArB_] := N[(U * N[(ArB * N[(-0.3333333333333333 * N[(U * U), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = U * (ArB * (((-333333333333333314829616256247390992939472198486328125e-54) * (U * U)) + (-1))) END code
U \cdot \left(ArB \cdot \mathsf{fma}\left(-0.3333333333333333, U \cdot U, -1\right)\right)
Initial program 30.5%
Taylor expanded in U around 0
Applied rewrites99.5%
Applied rewrites99.5%
(FPCore (U ArB) :precision binary64 :pre TRUE (- (* ArB U)))
double code(double U, double ArB) {
return -(ArB * U);
}
real(8) function code(u, arb)
use fmin_fmax_functions
real(8), intent (in) :: u
real(8), intent (in) :: arb
code = -(arb * u)
end function
public static double code(double U, double ArB) {
return -(ArB * U);
}
def code(U, ArB): return -(ArB * U)
function code(U, ArB) return Float64(-Float64(ArB * U)) end
function tmp = code(U, ArB) tmp = -(ArB * U); end
code[U_, ArB_] := (-N[(ArB * U), $MachinePrecision])
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = - (ArB * U) END code
-ArB \cdot U
Initial program 30.5%
Taylor expanded in U around 0
Applied rewrites99.0%
Applied rewrites99.0%
(FPCore (U ArB) :precision binary64 :pre TRUE (/ ArB U))
double code(double U, double ArB) {
return ArB / U;
}
real(8) function code(u, arb)
use fmin_fmax_functions
real(8), intent (in) :: u
real(8), intent (in) :: arb
code = arb / u
end function
public static double code(double U, double ArB) {
return ArB / U;
}
def code(U, ArB): return ArB / U
function code(U, ArB) return Float64(ArB / U) end
function tmp = code(U, ArB) tmp = ArB / U; end
code[U_, ArB_] := N[(ArB / U), $MachinePrecision]
f(U, ArB): U in [-inf, +inf], ArB in [-inf, +inf] code: THEORY BEGIN f(U, ArB: real): real = ArB / U END code
\frac{ArB}{U}
Initial program 30.5%
Taylor expanded in U around inf
Applied rewrites1.9%
herbie shell --seed 2026050 +o generate:egglog
(FPCore (U ArB)
:name "forward-v"
:precision binary64
(* 0.5 (* ArB (log (/ (- 1.0 U) (+ 1.0 U))))))