Average Error: 0.1 → 0.2
Time: 24.9s
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{1}{\frac{\sqrt{a - \frac{1.0}{3.0}}}{rand}}\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{1}{\frac{\sqrt{a - \frac{1.0}{3.0}}}{rand}}\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 r1801259 = a;
        double r1801260 = 1.0;
        double r1801261 = 3.0;
        double r1801262 = r1801260 / r1801261;
        double r1801263 = r1801259 - r1801262;
        double r1801264 = 1.0;
        double r1801265 = 9.0;
        double r1801266 = r1801265 * r1801263;
        double r1801267 = sqrt(r1801266);
        double r1801268 = r1801264 / r1801267;
        double r1801269 = rand;
        double r1801270 = r1801268 * r1801269;
        double r1801271 = r1801264 + r1801270;
        double r1801272 = r1801263 * r1801271;
        return r1801272;
}

double f(double a, double rand) {
        double r1801273 = 0.3333333333333333;
        double r1801274 = 1.0;
        double r1801275 = a;
        double r1801276 = 1.0;
        double r1801277 = 3.0;
        double r1801278 = r1801276 / r1801277;
        double r1801279 = r1801275 - r1801278;
        double r1801280 = sqrt(r1801279);
        double r1801281 = rand;
        double r1801282 = r1801280 / r1801281;
        double r1801283 = r1801274 / r1801282;
        double r1801284 = r1801273 * r1801283;
        double r1801285 = fma(r1801284, r1801279, r1801279);
        return r1801285;
}

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. Using strategy rm
  9. Applied clear-num0.2

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

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

Reproduce

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