Average Error: 0.1 → 0.1
Time: 3.8m
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)\]
\[(\left(\frac{1}{\frac{\sqrt{\left(a - \frac{1.0}{3.0}\right) \cdot 9}}{rand}}\right) \cdot \left(a - \frac{1.0}{3.0}\right) + \left(a - \frac{1.0}{3.0}\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)
(\left(\frac{1}{\frac{\sqrt{\left(a - \frac{1.0}{3.0}\right) \cdot 9}}{rand}}\right) \cdot \left(a - \frac{1.0}{3.0}\right) + \left(a - \frac{1.0}{3.0}\right))_*
double f(double a, double rand) {
        double r12101622 = a;
        double r12101623 = 1.0;
        double r12101624 = 3.0;
        double r12101625 = r12101623 / r12101624;
        double r12101626 = r12101622 - r12101625;
        double r12101627 = 1.0;
        double r12101628 = 9.0;
        double r12101629 = r12101628 * r12101626;
        double r12101630 = sqrt(r12101629);
        double r12101631 = r12101627 / r12101630;
        double r12101632 = rand;
        double r12101633 = r12101631 * r12101632;
        double r12101634 = r12101627 + r12101633;
        double r12101635 = r12101626 * r12101634;
        return r12101635;
}

double f(double a, double rand) {
        double r12101636 = 1.0;
        double r12101637 = a;
        double r12101638 = 1.0;
        double r12101639 = 3.0;
        double r12101640 = r12101638 / r12101639;
        double r12101641 = r12101637 - r12101640;
        double r12101642 = 9.0;
        double r12101643 = r12101641 * r12101642;
        double r12101644 = sqrt(r12101643);
        double r12101645 = rand;
        double r12101646 = r12101644 / r12101645;
        double r12101647 = r12101636 / r12101646;
        double r12101648 = fma(r12101647, r12101641, r12101641);
        return r12101648;
}

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}{(\left(\frac{rand}{\sqrt{9 \cdot \left(a - \frac{1.0}{3.0}\right)}}\right) \cdot \left(a - \frac{1.0}{3.0}\right) + \left(a - \frac{1.0}{3.0}\right))_*}\]
  3. Using strategy rm
  4. Applied *-un-lft-identity0.1

    \[\leadsto (\left(\frac{\color{blue}{1 \cdot rand}}{\sqrt{9 \cdot \left(a - \frac{1.0}{3.0}\right)}}\right) \cdot \left(a - \frac{1.0}{3.0}\right) + \left(a - \frac{1.0}{3.0}\right))_*\]
  5. Applied associate-/l*0.1

    \[\leadsto (\color{blue}{\left(\frac{1}{\frac{\sqrt{9 \cdot \left(a - \frac{1.0}{3.0}\right)}}{rand}}\right)} \cdot \left(a - \frac{1.0}{3.0}\right) + \left(a - \frac{1.0}{3.0}\right))_*\]
  6. Final simplification0.1

    \[\leadsto (\left(\frac{1}{\frac{\sqrt{\left(a - \frac{1.0}{3.0}\right) \cdot 9}}{rand}}\right) \cdot \left(a - \frac{1.0}{3.0}\right) + \left(a - \frac{1.0}{3.0}\right))_*\]

Reproduce

herbie shell --seed 2019112 +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))))