Average Error: 0.1 → 0.1
Time: 2.2m
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{rand}{\sqrt{\left(a - \frac{1.0}{3.0}\right) \cdot 9}}\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{rand}{\sqrt{\left(a - \frac{1.0}{3.0}\right) \cdot 9}}\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 r5580902 = a;
        double r5580903 = 1.0;
        double r5580904 = 3.0;
        double r5580905 = r5580903 / r5580904;
        double r5580906 = r5580902 - r5580905;
        double r5580907 = 1.0;
        double r5580908 = 9.0;
        double r5580909 = r5580908 * r5580906;
        double r5580910 = sqrt(r5580909);
        double r5580911 = r5580907 / r5580910;
        double r5580912 = rand;
        double r5580913 = r5580911 * r5580912;
        double r5580914 = r5580907 + r5580913;
        double r5580915 = r5580906 * r5580914;
        return r5580915;
}

double f(double a, double rand) {
        double r5580916 = rand;
        double r5580917 = a;
        double r5580918 = 1.0;
        double r5580919 = 3.0;
        double r5580920 = r5580918 / r5580919;
        double r5580921 = r5580917 - r5580920;
        double r5580922 = 9.0;
        double r5580923 = r5580921 * r5580922;
        double r5580924 = sqrt(r5580923);
        double r5580925 = r5580916 / r5580924;
        double r5580926 = fma(r5580925, r5580921, r5580921);
        return r5580926;
}

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 *-commutative0.1

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

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

Reproduce

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