Average Error: 0.2 → 0.1
Time: 1.6m
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}{3} \cdot \frac{rand}{\sqrt{a - \frac{1.0}{3.0}}}\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 r5647076 = a;
        double r5647077 = 1.0;
        double r5647078 = 3.0;
        double r5647079 = r5647077 / r5647078;
        double r5647080 = r5647076 - r5647079;
        double r5647081 = 1.0;
        double r5647082 = 9.0;
        double r5647083 = r5647082 * r5647080;
        double r5647084 = sqrt(r5647083);
        double r5647085 = r5647081 / r5647084;
        double r5647086 = rand;
        double r5647087 = r5647085 * r5647086;
        double r5647088 = r5647081 + r5647087;
        double r5647089 = r5647080 * r5647088;
        return r5647089;
}

double f(double a, double rand) {
        double r5647090 = 0.3333333333333333;
        double r5647091 = rand;
        double r5647092 = a;
        double r5647093 = 1.0;
        double r5647094 = 3.0;
        double r5647095 = r5647093 / r5647094;
        double r5647096 = r5647092 - r5647095;
        double r5647097 = sqrt(r5647096);
        double r5647098 = r5647091 / r5647097;
        double r5647099 = r5647090 * r5647098;
        double r5647100 = fma(r5647099, r5647096, r5647096);
        return r5647100;
}

\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}{3} \cdot \frac{rand}{\sqrt{a - \frac{1.0}{3.0}}}\right) \cdot \left(a - \frac{1.0}{3.0}\right) + \left(a - \frac{1.0}{3.0}\right))_*

Error

Bits error versus a

Bits error versus rand

Derivation

  1. Initial program 0.2

    \[\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 sqrt-prod0.1

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

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

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

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

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

Reproduce

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