Average Error: 0.1 → 0.1
Time: 33.7s
Precision: 64
\[\left(a - \frac{1.0}{3.0}\right) \cdot \left(1 + \frac{1}{\sqrt{9 \cdot \left(a - \frac{1.0}{3.0}\right)}} \cdot rand\right)\]
\[\mathsf{fma}\left(\left(\frac{\frac{rand}{3}}{\sqrt{a - \frac{1.0}{3.0}}}\right), \left(a - \frac{1.0}{3.0}\right), \left(a - \frac{1.0}{3.0}\right)\right)\]
\left(a - \frac{1.0}{3.0}\right) \cdot \left(1 + \frac{1}{\sqrt{9 \cdot \left(a - \frac{1.0}{3.0}\right)}} \cdot rand\right)
\mathsf{fma}\left(\left(\frac{\frac{rand}{3}}{\sqrt{a - \frac{1.0}{3.0}}}\right), \left(a - \frac{1.0}{3.0}\right), \left(a - \frac{1.0}{3.0}\right)\right)
double f(double a, double rand) {
        double r2499311 = a;
        double r2499312 = 1.0;
        double r2499313 = 3.0;
        double r2499314 = r2499312 / r2499313;
        double r2499315 = r2499311 - r2499314;
        double r2499316 = 1.0;
        double r2499317 = 9.0;
        double r2499318 = r2499317 * r2499315;
        double r2499319 = sqrt(r2499318);
        double r2499320 = r2499316 / r2499319;
        double r2499321 = rand;
        double r2499322 = r2499320 * r2499321;
        double r2499323 = r2499316 + r2499322;
        double r2499324 = r2499315 * r2499323;
        return r2499324;
}

double f(double a, double rand) {
        double r2499325 = rand;
        double r2499326 = 3.0;
        double r2499327 = r2499325 / r2499326;
        double r2499328 = a;
        double r2499329 = 1.0;
        double r2499330 = 3.0;
        double r2499331 = r2499329 / r2499330;
        double r2499332 = r2499328 - r2499331;
        double r2499333 = sqrt(r2499332);
        double r2499334 = r2499327 / r2499333;
        double r2499335 = fma(r2499334, r2499332, r2499332);
        return r2499335;
}

Error

Bits error versus a

Bits error versus rand

Derivation

  1. Initial program 0.1

    \[\left(a - \frac{1.0}{3.0}\right) \cdot \left(1 + \frac{1}{\sqrt{9 \cdot \left(a - \frac{1.0}{3.0}\right)}} \cdot rand\right)\]
  2. Simplified0.1

    \[\leadsto \color{blue}{\mathsf{fma}\left(\left(\frac{rand}{\sqrt{9 \cdot \left(a - \frac{1.0}{3.0}\right)}}\right), \left(a - \frac{1.0}{3.0}\right), \left(a - \frac{1.0}{3.0}\right)\right)}\]
  3. Using strategy rm
  4. Applied sqrt-prod0.1

    \[\leadsto \mathsf{fma}\left(\left(\frac{rand}{\color{blue}{\sqrt{9} \cdot \sqrt{a - \frac{1.0}{3.0}}}}\right), \left(a - \frac{1.0}{3.0}\right), \left(a - \frac{1.0}{3.0}\right)\right)\]
  5. Applied associate-/r*0.1

    \[\leadsto \mathsf{fma}\left(\color{blue}{\left(\frac{\frac{rand}{\sqrt{9}}}{\sqrt{a - \frac{1.0}{3.0}}}\right)}, \left(a - \frac{1.0}{3.0}\right), \left(a - \frac{1.0}{3.0}\right)\right)\]
  6. Simplified0.1

    \[\leadsto \mathsf{fma}\left(\left(\frac{\color{blue}{\frac{rand}{3}}}{\sqrt{a - \frac{1.0}{3.0}}}\right), \left(a - \frac{1.0}{3.0}\right), \left(a - \frac{1.0}{3.0}\right)\right)\]
  7. Final simplification0.1

    \[\leadsto \mathsf{fma}\left(\left(\frac{\frac{rand}{3}}{\sqrt{a - \frac{1.0}{3.0}}}\right), \left(a - \frac{1.0}{3.0}\right), \left(a - \frac{1.0}{3.0}\right)\right)\]

Reproduce

herbie shell --seed 2019130 +o rules:numerics
(FPCore (a rand)
  :name "Octave 3.8, oct_fill_randg"
  (* (- a (/ 1.0 3.0)) (+ 1 (* (/ 1 (sqrt (* 9 (- a (/ 1.0 3.0))))) rand))))