\frac{1}{\sqrt{x}} - \frac{1}{\sqrt{x + 1}}\frac{\sqrt{\left(\sqrt{x + 1} \cdot \sqrt{x + 1} + \left(\sqrt{x} \cdot \sqrt{x} - \sqrt{x + 1} \cdot \sqrt{x}\right)\right) \cdot \frac{1}{\mathsf{fma}\left(\left(\sqrt{x + 1}\right), \left(x + 1\right), \left(x \cdot \sqrt{x}\right)\right)}} \cdot \sqrt{\left(\sqrt{x + 1} \cdot \sqrt{x + 1} + \left(\sqrt{x} \cdot \sqrt{x} - \sqrt{x + 1} \cdot \sqrt{x}\right)\right) \cdot \frac{1}{\mathsf{fma}\left(\left(\sqrt{x + 1}\right), \left(x + 1\right), \left(x \cdot \sqrt{x}\right)\right)}}}{\sqrt{x + 1} \cdot \sqrt{x}}double f(double x) {
double r3211528 = 1.0;
double r3211529 = x;
double r3211530 = sqrt(r3211529);
double r3211531 = r3211528 / r3211530;
double r3211532 = r3211529 + r3211528;
double r3211533 = sqrt(r3211532);
double r3211534 = r3211528 / r3211533;
double r3211535 = r3211531 - r3211534;
return r3211535;
}
double f(double x) {
double r3211536 = x;
double r3211537 = 1.0;
double r3211538 = r3211536 + r3211537;
double r3211539 = sqrt(r3211538);
double r3211540 = r3211539 * r3211539;
double r3211541 = sqrt(r3211536);
double r3211542 = r3211541 * r3211541;
double r3211543 = r3211539 * r3211541;
double r3211544 = r3211542 - r3211543;
double r3211545 = r3211540 + r3211544;
double r3211546 = r3211536 * r3211541;
double r3211547 = fma(r3211539, r3211538, r3211546);
double r3211548 = r3211537 / r3211547;
double r3211549 = r3211545 * r3211548;
double r3211550 = sqrt(r3211549);
double r3211551 = r3211550 * r3211550;
double r3211552 = r3211551 / r3211543;
return r3211552;
}




Bits error versus x
| Original | 20.2 |
|---|---|
| Target | 0.7 |
| Herbie | 0.8 |
Initial program 20.2
rmApplied frac-sub20.2
Simplified20.2
rmApplied flip--20.1
Simplified0.4
rmApplied flip3-+0.8
Applied associate-/r/0.8
Simplified0.7
rmApplied add-sqr-sqrt0.8
Final simplification0.8
herbie shell --seed 2019132 +o rules:numerics
(FPCore (x)
:name "2isqrt (example 3.6)"
:herbie-target
(/ 1 (+ (* (+ x 1) (sqrt x)) (* x (sqrt (+ x 1)))))
(- (/ 1 (sqrt x)) (/ 1 (sqrt (+ x 1)))))