
(FPCore (phi0 es) :precision binary64 :pre (and (>= es 0.0) (< es 1.0)) (- 1.0 (* es (* (sin phi0) (sin phi0)))))
double code(double phi0, double es) {
return 1.0 - (es * (sin(phi0) * sin(phi0)));
}
real(8) function code(phi0, es)
use fmin_fmax_functions
real(8), intent (in) :: phi0
real(8), intent (in) :: es
code = 1.0d0 - (es * (sin(phi0) * sin(phi0)))
end function
public static double code(double phi0, double es) {
return 1.0 - (es * (Math.sin(phi0) * Math.sin(phi0)));
}
def code(phi0, es): return 1.0 - (es * (math.sin(phi0) * math.sin(phi0)))
function code(phi0, es) return Float64(1.0 - Float64(es * Float64(sin(phi0) * sin(phi0)))) end
function tmp = code(phi0, es) tmp = 1.0 - (es * (sin(phi0) * sin(phi0))); end
code[phi0_, es_] := N[(1.0 - N[(es * N[(N[Sin[phi0], $MachinePrecision] * N[Sin[phi0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
f(phi0, es): phi0 in [-inf, +inf], es in [0, 1] code: THEORY BEGIN f(phi0, es: real): real = (1) - (es * ((sin(phi0)) * (sin(phi0)))) END code
1 - es \cdot \left(\sin phi0 \cdot \sin phi0\right)
Herbie found 3 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (phi0 es) :precision binary64 :pre (and (>= es 0.0) (< es 1.0)) (- 1.0 (* es (* (sin phi0) (sin phi0)))))
double code(double phi0, double es) {
return 1.0 - (es * (sin(phi0) * sin(phi0)));
}
real(8) function code(phi0, es)
use fmin_fmax_functions
real(8), intent (in) :: phi0
real(8), intent (in) :: es
code = 1.0d0 - (es * (sin(phi0) * sin(phi0)))
end function
public static double code(double phi0, double es) {
return 1.0 - (es * (Math.sin(phi0) * Math.sin(phi0)));
}
def code(phi0, es): return 1.0 - (es * (math.sin(phi0) * math.sin(phi0)))
function code(phi0, es) return Float64(1.0 - Float64(es * Float64(sin(phi0) * sin(phi0)))) end
function tmp = code(phi0, es) tmp = 1.0 - (es * (sin(phi0) * sin(phi0))); end
code[phi0_, es_] := N[(1.0 - N[(es * N[(N[Sin[phi0], $MachinePrecision] * N[Sin[phi0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
f(phi0, es): phi0 in [-inf, +inf], es in [0, 1] code: THEORY BEGIN f(phi0, es: real): real = (1) - (es * ((sin(phi0)) * (sin(phi0)))) END code
1 - es \cdot \left(\sin phi0 \cdot \sin phi0\right)
(FPCore (phi0 es) :precision binary64 :pre (and (>= es 0.0) (< es 1.0)) (- 1.0 (* es (fma -0.5 (cos (+ phi0 phi0)) 0.5))))
double code(double phi0, double es) {
return 1.0 - (es * fma(-0.5, cos((phi0 + phi0)), 0.5));
}
function code(phi0, es) return Float64(1.0 - Float64(es * fma(-0.5, cos(Float64(phi0 + phi0)), 0.5))) end
code[phi0_, es_] := N[(1.0 - N[(es * N[(-0.5 * N[Cos[N[(phi0 + phi0), $MachinePrecision]], $MachinePrecision] + 0.5), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
f(phi0, es): phi0 in [-inf, +inf], es in [0, 1] code: THEORY BEGIN f(phi0, es: real): real = (1) - (es * (((-5e-1) * (cos((phi0 + phi0)))) + (5e-1))) END code
1 - es \cdot \mathsf{fma}\left(-0.5, \cos \left(phi0 + phi0\right), 0.5\right)
Initial program 100.0%
Taylor expanded in phi0 around inf
Applied rewrites100.0%
Applied rewrites100.0%
(FPCore (phi0 es) :precision binary64 :pre (and (>= es 0.0) (< es 1.0)) 1.0)
double code(double phi0, double es) {
return 1.0;
}
real(8) function code(phi0, es)
use fmin_fmax_functions
real(8), intent (in) :: phi0
real(8), intent (in) :: es
code = 1.0d0
end function
public static double code(double phi0, double es) {
return 1.0;
}
def code(phi0, es): return 1.0
function code(phi0, es) return 1.0 end
function tmp = code(phi0, es) tmp = 1.0; end
code[phi0_, es_] := 1.0
f(phi0, es): phi0 in [-inf, +inf], es in [0, 1] code: THEORY BEGIN f(phi0, es: real): real = 1 END code
1
Initial program 100.0%
Taylor expanded in phi0 around 0
Applied rewrites98.9%
(FPCore (phi0 es) :precision binary64 :pre (and (>= es 0.0) (< es 1.0)) 0.3333333333333333)
double code(double phi0, double es) {
return 0.3333333333333333;
}
real(8) function code(phi0, es)
use fmin_fmax_functions
real(8), intent (in) :: phi0
real(8), intent (in) :: es
code = 0.3333333333333333d0
end function
public static double code(double phi0, double es) {
return 0.3333333333333333;
}
def code(phi0, es): return 0.3333333333333333
function code(phi0, es) return 0.3333333333333333 end
function tmp = code(phi0, es) tmp = 0.3333333333333333; end
code[phi0_, es_] := 0.3333333333333333
f(phi0, es): phi0 in [-inf, +inf], es in [0, 1] code: THEORY BEGIN f(phi0, es: real): real = 333333333333333314829616256247390992939472198486328125e-54 END code
0.3333333333333333
Initial program 100.0%
Applied rewrites98.0%
Applied rewrites98.0%
Applied rewrites98.0%
Applied rewrites17.6%
herbie shell --seed 2026050 +o generate:egglog
(FPCore (phi0 es)
:name "init-con"
:precision binary64
:pre (and (>= es 0.0) (< es 1.0))
(- 1.0 (* es (* (sin phi0) (sin phi0)))))