
(FPCore (f n) :precision binary64 (/ (- (+ f n)) (- f n)))
double code(double f, double n) {
return -(f + n) / (f - n);
}
real(8) function code(f, n)
use fmin_fmax_functions
real(8), intent (in) :: f
real(8), intent (in) :: n
code = -(f + n) / (f - n)
end function
public static double code(double f, double n) {
return -(f + n) / (f - n);
}
def code(f, n): return -(f + n) / (f - n)
function code(f, n) return Float64(Float64(-Float64(f + n)) / Float64(f - n)) end
function tmp = code(f, n) tmp = -(f + n) / (f - n); end
code[f_, n_] := N[((-N[(f + n), $MachinePrecision]) / N[(f - n), $MachinePrecision]), $MachinePrecision]
\frac{-\left(f + n\right)}{f - n}
Herbie found 2 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (f n) :precision binary64 (/ (- (+ f n)) (- f n)))
double code(double f, double n) {
return -(f + n) / (f - n);
}
real(8) function code(f, n)
use fmin_fmax_functions
real(8), intent (in) :: f
real(8), intent (in) :: n
code = -(f + n) / (f - n)
end function
public static double code(double f, double n) {
return -(f + n) / (f - n);
}
def code(f, n): return -(f + n) / (f - n)
function code(f, n) return Float64(Float64(-Float64(f + n)) / Float64(f - n)) end
function tmp = code(f, n) tmp = -(f + n) / (f - n); end
code[f_, n_] := N[((-N[(f + n), $MachinePrecision]) / N[(f - n), $MachinePrecision]), $MachinePrecision]
\frac{-\left(f + n\right)}{f - n}
(FPCore (f n) :precision binary64 (- (/ n (- n f)) (/ f (- f n))))
double code(double f, double n) {
return (n / (n - f)) - (f / (f - n));
}
real(8) function code(f, n)
use fmin_fmax_functions
real(8), intent (in) :: f
real(8), intent (in) :: n
code = (n / (n - f)) - (f / (f - n))
end function
public static double code(double f, double n) {
return (n / (n - f)) - (f / (f - n));
}
def code(f, n): return (n / (n - f)) - (f / (f - n))
function code(f, n) return Float64(Float64(n / Float64(n - f)) - Float64(f / Float64(f - n))) end
function tmp = code(f, n) tmp = (n / (n - f)) - (f / (f - n)); end
code[f_, n_] := N[(N[(n / N[(n - f), $MachinePrecision]), $MachinePrecision] - N[(f / N[(f - n), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\frac{n}{n - f} - \frac{f}{f - n}
Initial program 100.0%
lift-/.f64N/A
frac-2negN/A
distribute-frac-neg2N/A
lift-neg.f64N/A
remove-double-negN/A
lift-+.f64N/A
add-flipN/A
div-subN/A
sub-negateN/A
lower--.f64N/A
distribute-frac-negN/A
distribute-neg-frac2N/A
add-sound-/N/A
lower-/.f64N/A
lift--.f64N/A
sub-negate-revN/A
lower--.f64N/A
add-sound-/N/A
lower-/.f64100.0%
Applied rewrites100.0%
(FPCore (f n) :precision binary64 (/ (+ n f) (- n f)))
double code(double f, double n) {
return (n + f) / (n - f);
}
real(8) function code(f, n)
use fmin_fmax_functions
real(8), intent (in) :: f
real(8), intent (in) :: n
code = (n + f) / (n - f)
end function
public static double code(double f, double n) {
return (n + f) / (n - f);
}
def code(f, n): return (n + f) / (n - f)
function code(f, n) return Float64(Float64(n + f) / Float64(n - f)) end
function tmp = code(f, n) tmp = (n + f) / (n - f); end
code[f_, n_] := N[(N[(n + f), $MachinePrecision] / N[(n - f), $MachinePrecision]), $MachinePrecision]
\frac{n + f}{n - f}
Initial program 100.0%
lift-/.f64N/A
mult-flipN/A
*-commutativeN/A
lift-neg.f64N/A
distribute-rgt-neg-outN/A
*-commutativeN/A
mult-flipN/A
lift-+.f64N/A
div-addN/A
+-commutativeN/A
add-to-fractionN/A
distribute-neg-frac2N/A
add-sound-/N/A
lower-/.f64N/A
Applied rewrites100.0%
herbie shell --seed 2025326 -o generate:taylor -o generate:evaluate
(FPCore (f n)
:name "subtraction fraction"
:precision binary64
(/ (- (+ f n)) (- f n)))