Average Error: 31.4 → 0.3
Time: 4.3s
Precision: 64
\[\frac{1 - \cos x}{x \cdot x}\]
\[\begin{array}{l} \mathbf{if}\;x \le -0.031454960231223988 \lor \neg \left(x \le 0.033122201796403697\right):\\ \;\;\;\;\frac{1}{x} \cdot \frac{1 - \cos x}{x}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left({x}^{4}, \frac{1}{720}, \frac{1}{2} - \frac{1}{24} \cdot {x}^{2}\right)\\ \end{array}\]
\frac{1 - \cos x}{x \cdot x}
\begin{array}{l}
\mathbf{if}\;x \le -0.031454960231223988 \lor \neg \left(x \le 0.033122201796403697\right):\\
\;\;\;\;\frac{1}{x} \cdot \frac{1 - \cos x}{x}\\

\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left({x}^{4}, \frac{1}{720}, \frac{1}{2} - \frac{1}{24} \cdot {x}^{2}\right)\\

\end{array}
double f(double x) {
        double r21794 = 1.0;
        double r21795 = x;
        double r21796 = cos(r21795);
        double r21797 = r21794 - r21796;
        double r21798 = r21795 * r21795;
        double r21799 = r21797 / r21798;
        return r21799;
}

double f(double x) {
        double r21800 = x;
        double r21801 = -0.03145496023122399;
        bool r21802 = r21800 <= r21801;
        double r21803 = 0.0331222017964037;
        bool r21804 = r21800 <= r21803;
        double r21805 = !r21804;
        bool r21806 = r21802 || r21805;
        double r21807 = 1.0;
        double r21808 = r21807 / r21800;
        double r21809 = 1.0;
        double r21810 = cos(r21800);
        double r21811 = r21809 - r21810;
        double r21812 = r21811 / r21800;
        double r21813 = r21808 * r21812;
        double r21814 = 4.0;
        double r21815 = pow(r21800, r21814);
        double r21816 = 0.001388888888888889;
        double r21817 = 0.5;
        double r21818 = 0.041666666666666664;
        double r21819 = 2.0;
        double r21820 = pow(r21800, r21819);
        double r21821 = r21818 * r21820;
        double r21822 = r21817 - r21821;
        double r21823 = fma(r21815, r21816, r21822);
        double r21824 = r21806 ? r21813 : r21823;
        return r21824;
}

Error

Bits error versus x

Derivation

  1. Split input into 2 regimes
  2. if x < -0.03145496023122399 or 0.0331222017964037 < x

    1. Initial program 1.0

      \[\frac{1 - \cos x}{x \cdot x}\]
    2. Using strategy rm
    3. Applied add-exp-log1.0

      \[\leadsto \frac{\color{blue}{e^{\log \left(1 - \cos x\right)}}}{x \cdot x}\]
    4. Using strategy rm
    5. Applied *-un-lft-identity1.0

      \[\leadsto \frac{e^{\log \color{blue}{\left(1 \cdot \left(1 - \cos x\right)\right)}}}{x \cdot x}\]
    6. Applied log-prod1.0

      \[\leadsto \frac{e^{\color{blue}{\log 1 + \log \left(1 - \cos x\right)}}}{x \cdot x}\]
    7. Applied exp-sum1.0

      \[\leadsto \frac{\color{blue}{e^{\log 1} \cdot e^{\log \left(1 - \cos x\right)}}}{x \cdot x}\]
    8. Applied times-frac0.5

      \[\leadsto \color{blue}{\frac{e^{\log 1}}{x} \cdot \frac{e^{\log \left(1 - \cos x\right)}}{x}}\]
    9. Simplified0.5

      \[\leadsto \color{blue}{\frac{1}{x}} \cdot \frac{e^{\log \left(1 - \cos x\right)}}{x}\]
    10. Simplified0.5

      \[\leadsto \frac{1}{x} \cdot \color{blue}{\frac{1 - \cos x}{x}}\]

    if -0.03145496023122399 < x < 0.0331222017964037

    1. Initial program 62.2

      \[\frac{1 - \cos x}{x \cdot x}\]
    2. Taylor expanded around 0 0.0

      \[\leadsto \color{blue}{\left(\frac{1}{720} \cdot {x}^{4} + \frac{1}{2}\right) - \frac{1}{24} \cdot {x}^{2}}\]
    3. Simplified0.0

      \[\leadsto \color{blue}{\mathsf{fma}\left({x}^{4}, \frac{1}{720}, \frac{1}{2} - \frac{1}{24} \cdot {x}^{2}\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.3

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -0.031454960231223988 \lor \neg \left(x \le 0.033122201796403697\right):\\ \;\;\;\;\frac{1}{x} \cdot \frac{1 - \cos x}{x}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left({x}^{4}, \frac{1}{720}, \frac{1}{2} - \frac{1}{24} \cdot {x}^{2}\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2020081 +o rules:numerics
(FPCore (x)
  :name "cos2 (problem 3.4.1)"
  :precision binary64
  (/ (- 1 (cos x)) (* x x)))