Average Error: 0.1 → 0.2
Time: 34.1s
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(\frac{\frac{1}{\sqrt{\left(a - \frac{1.0}{3.0}\right) \cdot 9}}}{\frac{1}{rand}}, a - \frac{1.0}{3.0}, 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)
\mathsf{fma}\left(\frac{\frac{1}{\sqrt{\left(a - \frac{1.0}{3.0}\right) \cdot 9}}}{\frac{1}{rand}}, a - \frac{1.0}{3.0}, a - \frac{1.0}{3.0}\right)
double f(double a, double rand) {
        double r3665488 = a;
        double r3665489 = 1.0;
        double r3665490 = 3.0;
        double r3665491 = r3665489 / r3665490;
        double r3665492 = r3665488 - r3665491;
        double r3665493 = 1.0;
        double r3665494 = 9.0;
        double r3665495 = r3665494 * r3665492;
        double r3665496 = sqrt(r3665495);
        double r3665497 = r3665493 / r3665496;
        double r3665498 = rand;
        double r3665499 = r3665497 * r3665498;
        double r3665500 = r3665493 + r3665499;
        double r3665501 = r3665492 * r3665500;
        return r3665501;
}

double f(double a, double rand) {
        double r3665502 = 1.0;
        double r3665503 = a;
        double r3665504 = 1.0;
        double r3665505 = 3.0;
        double r3665506 = r3665504 / r3665505;
        double r3665507 = r3665503 - r3665506;
        double r3665508 = 9.0;
        double r3665509 = r3665507 * r3665508;
        double r3665510 = sqrt(r3665509);
        double r3665511 = r3665502 / r3665510;
        double r3665512 = rand;
        double r3665513 = r3665502 / r3665512;
        double r3665514 = r3665511 / r3665513;
        double r3665515 = fma(r3665514, r3665507, r3665507);
        return r3665515;
}

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

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

    \[\leadsto \mathsf{fma}\left(\color{blue}{\frac{1}{\frac{\sqrt{9 \cdot \left(a - \frac{1.0}{3.0}\right)}}{rand}}}, a - \frac{1.0}{3.0}, a - \frac{1.0}{3.0}\right)\]
  6. Using strategy rm
  7. Applied div-inv0.2

    \[\leadsto \mathsf{fma}\left(\frac{1}{\color{blue}{\sqrt{9 \cdot \left(a - \frac{1.0}{3.0}\right)} \cdot \frac{1}{rand}}}, a - \frac{1.0}{3.0}, a - \frac{1.0}{3.0}\right)\]
  8. Applied associate-/r*0.2

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

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

Reproduce

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