Average Error: 0.1 → 0.1
Time: 3.3m
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{1}{3} \cdot \frac{rand}{\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{1}{3} \cdot \frac{rand}{\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 r12233826 = a;
        double r12233827 = 1.0;
        double r12233828 = 3.0;
        double r12233829 = r12233827 / r12233828;
        double r12233830 = r12233826 - r12233829;
        double r12233831 = 1.0;
        double r12233832 = 9.0;
        double r12233833 = r12233832 * r12233830;
        double r12233834 = sqrt(r12233833);
        double r12233835 = r12233831 / r12233834;
        double r12233836 = rand;
        double r12233837 = r12233835 * r12233836;
        double r12233838 = r12233831 + r12233837;
        double r12233839 = r12233830 * r12233838;
        return r12233839;
}

double f(double a, double rand) {
        double r12233840 = 0.3333333333333333;
        double r12233841 = rand;
        double r12233842 = a;
        double r12233843 = 1.0;
        double r12233844 = 3.0;
        double r12233845 = r12233843 / r12233844;
        double r12233846 = r12233842 - r12233845;
        double r12233847 = sqrt(r12233846);
        double r12233848 = r12233841 / r12233847;
        double r12233849 = r12233840 * r12233848;
        double r12233850 = fma(r12233849, r12233846, r12233846);
        return r12233850;
}

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 *-un-lft-identity0.1

    \[\leadsto \mathsf{fma}\left(\left(\frac{\color{blue}{1 \cdot rand}}{\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)\]
  6. Applied times-frac0.1

    \[\leadsto \mathsf{fma}\left(\color{blue}{\left(\frac{1}{\sqrt{9}} \cdot \frac{rand}{\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. Simplified0.1

    \[\leadsto \mathsf{fma}\left(\left(\color{blue}{\frac{1}{3}} \cdot \frac{rand}{\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)\]
  8. Final simplification0.1

    \[\leadsto \mathsf{fma}\left(\left(\frac{1}{3} \cdot \frac{rand}{\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 2019121 +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))))