Rust f64::asinh

Percentage Accurate: 29.8% → 99.8%
Time: 6.2s
Alternatives: 4
Speedup: 1.9×

Specification

?
\[\begin{array}{l} \\ \sinh^{-1} x \end{array} \]
(FPCore (x) :precision binary64 (asinh x))
double code(double x) {
	return asinh(x);
}
def code(x):
	return math.asinh(x)
function code(x)
	return asinh(x)
end
function tmp = code(x)
	tmp = asinh(x);
end
code[x_] := N[ArcSinh[x], $MachinePrecision]
\begin{array}{l}

\\
\sinh^{-1} x
\end{array}

Sampling outcomes in binary64 precision:

Local Percentage Accuracy vs ?

The average percentage accuracy by input value. Horizontal axis shows value of an input variable; the variable is choosen in the title. Vertical axis is accuracy; higher is better. Red represent the original program, while blue represents Herbie's suggestion. These can be toggled with buttons below the plot. The line is an average while dots represent individual samples.

Accuracy vs Speed?

Herbie found 4 alternatives:

AlternativeAccuracySpeedup
The accuracy (vertical axis) and speed (horizontal axis) of each alternatives. Up and to the right is better. The red square shows the initial program, and each blue circle shows an alternative.The line shows the best available speed-accuracy tradeoffs.

Initial Program: 29.8% accurate, 1.0× speedup?

\[\begin{array}{l} \\ \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \end{array} \]
(FPCore (x)
 :precision binary64
 (copysign (log (+ (fabs x) (sqrt (+ (* x x) 1.0)))) x))
double code(double x) {
	return copysign(log((fabs(x) + sqrt(((x * x) + 1.0)))), x);
}
public static double code(double x) {
	return Math.copySign(Math.log((Math.abs(x) + Math.sqrt(((x * x) + 1.0)))), x);
}
def code(x):
	return math.copysign(math.log((math.fabs(x) + math.sqrt(((x * x) + 1.0)))), x)
function code(x)
	return copysign(log(Float64(abs(x) + sqrt(Float64(Float64(x * x) + 1.0)))), x)
end
function tmp = code(x)
	tmp = sign(x) * abs(log((abs(x) + sqrt(((x * x) + 1.0)))));
end
code[x_] := N[With[{TMP1 = Abs[N[Log[N[(N[Abs[x], $MachinePrecision] + N[Sqrt[N[(N[(x * x), $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], TMP2 = Sign[x]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision]
\begin{array}{l}

\\
\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right)
\end{array}

Alternative 1: 99.8% accurate, 1.1× speedup?

\[\begin{array}{l} \\ \mathsf{copysign}\left(\sinh^{-1} x, x\right) \end{array} \]
(FPCore (x) :precision binary64 (copysign (asinh x) x))
double code(double x) {
	return copysign(asinh(x), x);
}
def code(x):
	return math.copysign(math.asinh(x), x)
function code(x)
	return copysign(asinh(x), x)
end
function tmp = code(x)
	tmp = sign(x) * abs(asinh(x));
end
code[x_] := N[With[{TMP1 = Abs[N[ArcSinh[x], $MachinePrecision]], TMP2 = Sign[x]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision]
\begin{array}{l}

\\
\mathsf{copysign}\left(\sinh^{-1} x, x\right)
\end{array}
Derivation
  1. Initial program 29.5%

    \[\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \]
  2. Add Preprocessing
  3. Step-by-step derivation
    1. lift-log.f64N/A

      \[\leadsto \mathsf{copysign}\left(\color{blue}{\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right)}, x\right) \]
    2. lift-+.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \color{blue}{\left(\left|x\right| + \sqrt{x \cdot x + 1}\right)}, x\right) \]
    3. lift-sqrt.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \color{blue}{\sqrt{x \cdot x + 1}}\right), x\right) \]
    4. lift-+.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x + 1}}\right), x\right) \]
    5. lift-*.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x} + 1}\right), x\right) \]
    6. sqr-abs-revN/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{\left|x\right| \cdot \left|x\right|} + 1}\right), x\right) \]
    7. lift-fabs.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{\left|x\right|} \cdot \left|x\right| + 1}\right), x\right) \]
    8. lift-fabs.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\left|x\right| \cdot \color{blue}{\left|x\right|} + 1}\right), x\right) \]
    9. asinh-def-revN/A

      \[\leadsto \mathsf{copysign}\left(\color{blue}{\sinh^{-1} \left(\left|x\right|\right)}, x\right) \]
    10. lower-asinh.f6499.8

      \[\leadsto \mathsf{copysign}\left(\color{blue}{\sinh^{-1} \left(\left|x\right|\right)}, x\right) \]
    11. lift-fabs.f64N/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left(\left|x\right|\right)}, x\right) \]
    12. rem-sqrt-square-revN/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left(\sqrt{x \cdot x}\right)}, x\right) \]
    13. pow2N/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left(\sqrt{\color{blue}{{x}^{2}}}\right), x\right) \]
    14. sqrt-pow1N/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left({x}^{\left(\frac{2}{2}\right)}\right)}, x\right) \]
    15. metadata-evalN/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left({x}^{\color{blue}{1}}\right), x\right) \]
    16. unpow199.8

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{x}, x\right) \]
  4. Applied rewrites99.8%

    \[\leadsto \color{blue}{\mathsf{copysign}\left(\sinh^{-1} x, x\right)} \]
  5. Add Preprocessing

Alternative 2: 51.9% accurate, 1.5× speedup?

\[\begin{array}{l} \\ \mathsf{copysign}\left(\mathsf{fma}\left(\mathsf{fma}\left(0.075 \cdot x, x, \left(x \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot -0.044642857142857144\right) - 0.16666666666666666\right) \cdot \left(x \cdot x\right), x, x\right), x\right) \end{array} \]
(FPCore (x)
 :precision binary64
 (copysign
  (fma
   (*
    (fma
     (* 0.075 x)
     x
     (- (* (* x x) (* (* x x) -0.044642857142857144)) 0.16666666666666666))
    (* x x))
   x
   x)
  x))
double code(double x) {
	return copysign(fma((fma((0.075 * x), x, (((x * x) * ((x * x) * -0.044642857142857144)) - 0.16666666666666666)) * (x * x)), x, x), x);
}
function code(x)
	return copysign(fma(Float64(fma(Float64(0.075 * x), x, Float64(Float64(Float64(x * x) * Float64(Float64(x * x) * -0.044642857142857144)) - 0.16666666666666666)) * Float64(x * x)), x, x), x)
end
code[x_] := N[With[{TMP1 = Abs[N[(N[(N[(N[(0.075 * x), $MachinePrecision] * x + N[(N[(N[(x * x), $MachinePrecision] * N[(N[(x * x), $MachinePrecision] * -0.044642857142857144), $MachinePrecision]), $MachinePrecision] - 0.16666666666666666), $MachinePrecision]), $MachinePrecision] * N[(x * x), $MachinePrecision]), $MachinePrecision] * x + x), $MachinePrecision]], TMP2 = Sign[x]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision]
\begin{array}{l}

\\
\mathsf{copysign}\left(\mathsf{fma}\left(\mathsf{fma}\left(0.075 \cdot x, x, \left(x \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot -0.044642857142857144\right) - 0.16666666666666666\right) \cdot \left(x \cdot x\right), x, x\right), x\right)
\end{array}
Derivation
  1. Initial program 29.5%

    \[\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \]
  2. Add Preprocessing
  3. Step-by-step derivation
    1. lift-log.f64N/A

      \[\leadsto \mathsf{copysign}\left(\color{blue}{\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right)}, x\right) \]
    2. lift-+.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \color{blue}{\left(\left|x\right| + \sqrt{x \cdot x + 1}\right)}, x\right) \]
    3. lift-sqrt.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \color{blue}{\sqrt{x \cdot x + 1}}\right), x\right) \]
    4. lift-+.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x + 1}}\right), x\right) \]
    5. lift-*.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x} + 1}\right), x\right) \]
    6. sqr-abs-revN/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{\left|x\right| \cdot \left|x\right|} + 1}\right), x\right) \]
    7. lift-fabs.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{\left|x\right|} \cdot \left|x\right| + 1}\right), x\right) \]
    8. lift-fabs.f64N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\left|x\right| \cdot \color{blue}{\left|x\right|} + 1}\right), x\right) \]
    9. asinh-def-revN/A

      \[\leadsto \mathsf{copysign}\left(\color{blue}{\sinh^{-1} \left(\left|x\right|\right)}, x\right) \]
    10. lower-asinh.f6499.8

      \[\leadsto \mathsf{copysign}\left(\color{blue}{\sinh^{-1} \left(\left|x\right|\right)}, x\right) \]
    11. lift-fabs.f64N/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left(\left|x\right|\right)}, x\right) \]
    12. rem-sqrt-square-revN/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left(\sqrt{x \cdot x}\right)}, x\right) \]
    13. pow2N/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left(\sqrt{\color{blue}{{x}^{2}}}\right), x\right) \]
    14. sqrt-pow1N/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left({x}^{\left(\frac{2}{2}\right)}\right)}, x\right) \]
    15. metadata-evalN/A

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left({x}^{\color{blue}{1}}\right), x\right) \]
    16. unpow199.8

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{x}, x\right) \]
  4. Applied rewrites99.8%

    \[\leadsto \color{blue}{\mathsf{copysign}\left(\sinh^{-1} x, x\right)} \]
  5. Taylor expanded in x around 0

    \[\leadsto \mathsf{copysign}\left(\color{blue}{x \cdot \left(1 + {x}^{2} \cdot \left({x}^{2} \cdot \left(\frac{3}{40} + \frac{-5}{112} \cdot {x}^{2}\right) - \frac{1}{6}\right)\right)}, x\right) \]
  6. Step-by-step derivation
    1. +-commutativeN/A

      \[\leadsto \mathsf{copysign}\left(x \cdot \color{blue}{\left({x}^{2} \cdot \left({x}^{2} \cdot \left(\frac{3}{40} + \frac{-5}{112} \cdot {x}^{2}\right) - \frac{1}{6}\right) + 1\right)}, x\right) \]
    2. distribute-lft-inN/A

      \[\leadsto \mathsf{copysign}\left(\color{blue}{x \cdot \left({x}^{2} \cdot \left({x}^{2} \cdot \left(\frac{3}{40} + \frac{-5}{112} \cdot {x}^{2}\right) - \frac{1}{6}\right)\right) + x \cdot 1}, x\right) \]
    3. associate-*r*N/A

      \[\leadsto \mathsf{copysign}\left(\color{blue}{\left(x \cdot {x}^{2}\right) \cdot \left({x}^{2} \cdot \left(\frac{3}{40} + \frac{-5}{112} \cdot {x}^{2}\right) - \frac{1}{6}\right)} + x \cdot 1, x\right) \]
    4. unpow2N/A

      \[\leadsto \mathsf{copysign}\left(\left(x \cdot \color{blue}{\left(x \cdot x\right)}\right) \cdot \left({x}^{2} \cdot \left(\frac{3}{40} + \frac{-5}{112} \cdot {x}^{2}\right) - \frac{1}{6}\right) + x \cdot 1, x\right) \]
    5. cube-multN/A

      \[\leadsto \mathsf{copysign}\left(\color{blue}{{x}^{3}} \cdot \left({x}^{2} \cdot \left(\frac{3}{40} + \frac{-5}{112} \cdot {x}^{2}\right) - \frac{1}{6}\right) + x \cdot 1, x\right) \]
    6. *-rgt-identityN/A

      \[\leadsto \mathsf{copysign}\left({x}^{3} \cdot \left({x}^{2} \cdot \left(\frac{3}{40} + \frac{-5}{112} \cdot {x}^{2}\right) - \frac{1}{6}\right) + \color{blue}{x}, x\right) \]
    7. lower-fma.f64N/A

      \[\leadsto \mathsf{copysign}\left(\color{blue}{\mathsf{fma}\left({x}^{3}, {x}^{2} \cdot \left(\frac{3}{40} + \frac{-5}{112} \cdot {x}^{2}\right) - \frac{1}{6}, x\right)}, x\right) \]
  7. Applied rewrites52.2%

    \[\leadsto \mathsf{copysign}\left(\color{blue}{\mathsf{fma}\left({x}^{3}, \mathsf{fma}\left(0.075 \cdot x, x, {x}^{4} \cdot -0.044642857142857144 - 0.16666666666666666\right), x\right)}, x\right) \]
  8. Step-by-step derivation
    1. Applied rewrites52.2%

      \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(\mathsf{fma}\left(0.075 \cdot x, x, -0.044642857142857144 \cdot {x}^{4} - 0.16666666666666666\right) \cdot \left(x \cdot x\right), \color{blue}{x}, x\right), x\right) \]
    2. Step-by-step derivation
      1. Applied rewrites52.2%

        \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(\mathsf{fma}\left(0.075 \cdot x, x, \left(x \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot -0.044642857142857144\right) - 0.16666666666666666\right) \cdot \left(x \cdot x\right), x, x\right), x\right) \]
      2. Add Preprocessing

      Alternative 3: 51.9% accurate, 1.7× speedup?

      \[\begin{array}{l} \\ \mathsf{copysign}\left(\mathsf{fma}\left(\left(\left(x \cdot x\right) \cdot 0.075 - 0.16666666666666666\right) \cdot \left(x \cdot x\right), x, x\right), x\right) \end{array} \]
      (FPCore (x)
       :precision binary64
       (copysign (fma (* (- (* (* x x) 0.075) 0.16666666666666666) (* x x)) x x) x))
      double code(double x) {
      	return copysign(fma(((((x * x) * 0.075) - 0.16666666666666666) * (x * x)), x, x), x);
      }
      
      function code(x)
      	return copysign(fma(Float64(Float64(Float64(Float64(x * x) * 0.075) - 0.16666666666666666) * Float64(x * x)), x, x), x)
      end
      
      code[x_] := N[With[{TMP1 = Abs[N[(N[(N[(N[(N[(x * x), $MachinePrecision] * 0.075), $MachinePrecision] - 0.16666666666666666), $MachinePrecision] * N[(x * x), $MachinePrecision]), $MachinePrecision] * x + x), $MachinePrecision]], TMP2 = Sign[x]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision]
      
      \begin{array}{l}
      
      \\
      \mathsf{copysign}\left(\mathsf{fma}\left(\left(\left(x \cdot x\right) \cdot 0.075 - 0.16666666666666666\right) \cdot \left(x \cdot x\right), x, x\right), x\right)
      \end{array}
      
      Derivation
      1. Initial program 29.5%

        \[\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \]
      2. Add Preprocessing
      3. Step-by-step derivation
        1. lift-log.f64N/A

          \[\leadsto \mathsf{copysign}\left(\color{blue}{\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right)}, x\right) \]
        2. lift-+.f64N/A

          \[\leadsto \mathsf{copysign}\left(\log \color{blue}{\left(\left|x\right| + \sqrt{x \cdot x + 1}\right)}, x\right) \]
        3. lift-sqrt.f64N/A

          \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \color{blue}{\sqrt{x \cdot x + 1}}\right), x\right) \]
        4. lift-+.f64N/A

          \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x + 1}}\right), x\right) \]
        5. lift-*.f64N/A

          \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x} + 1}\right), x\right) \]
        6. sqr-abs-revN/A

          \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{\left|x\right| \cdot \left|x\right|} + 1}\right), x\right) \]
        7. lift-fabs.f64N/A

          \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{\left|x\right|} \cdot \left|x\right| + 1}\right), x\right) \]
        8. lift-fabs.f64N/A

          \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\left|x\right| \cdot \color{blue}{\left|x\right|} + 1}\right), x\right) \]
        9. asinh-def-revN/A

          \[\leadsto \mathsf{copysign}\left(\color{blue}{\sinh^{-1} \left(\left|x\right|\right)}, x\right) \]
        10. lower-asinh.f6499.8

          \[\leadsto \mathsf{copysign}\left(\color{blue}{\sinh^{-1} \left(\left|x\right|\right)}, x\right) \]
        11. lift-fabs.f64N/A

          \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left(\left|x\right|\right)}, x\right) \]
        12. rem-sqrt-square-revN/A

          \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left(\sqrt{x \cdot x}\right)}, x\right) \]
        13. pow2N/A

          \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left(\sqrt{\color{blue}{{x}^{2}}}\right), x\right) \]
        14. sqrt-pow1N/A

          \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left({x}^{\left(\frac{2}{2}\right)}\right)}, x\right) \]
        15. metadata-evalN/A

          \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left({x}^{\color{blue}{1}}\right), x\right) \]
        16. unpow199.8

          \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{x}, x\right) \]
      4. Applied rewrites99.8%

        \[\leadsto \color{blue}{\mathsf{copysign}\left(\sinh^{-1} x, x\right)} \]
      5. Taylor expanded in x around 0

        \[\leadsto \mathsf{copysign}\left(\color{blue}{x \cdot \left(1 + {x}^{2} \cdot \left(\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}\right)\right)}, x\right) \]
      6. Step-by-step derivation
        1. +-commutativeN/A

          \[\leadsto \mathsf{copysign}\left(x \cdot \color{blue}{\left({x}^{2} \cdot \left(\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}\right) + 1\right)}, x\right) \]
        2. distribute-lft-inN/A

          \[\leadsto \mathsf{copysign}\left(\color{blue}{x \cdot \left({x}^{2} \cdot \left(\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}\right)\right) + x \cdot 1}, x\right) \]
        3. associate-*r*N/A

          \[\leadsto \mathsf{copysign}\left(\color{blue}{\left(x \cdot {x}^{2}\right) \cdot \left(\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}\right)} + x \cdot 1, x\right) \]
        4. unpow2N/A

          \[\leadsto \mathsf{copysign}\left(\left(x \cdot \color{blue}{\left(x \cdot x\right)}\right) \cdot \left(\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}\right) + x \cdot 1, x\right) \]
        5. cube-multN/A

          \[\leadsto \mathsf{copysign}\left(\color{blue}{{x}^{3}} \cdot \left(\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}\right) + x \cdot 1, x\right) \]
        6. *-rgt-identityN/A

          \[\leadsto \mathsf{copysign}\left({x}^{3} \cdot \left(\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}\right) + \color{blue}{x}, x\right) \]
        7. lower-fma.f64N/A

          \[\leadsto \mathsf{copysign}\left(\color{blue}{\mathsf{fma}\left({x}^{3}, \frac{3}{40} \cdot {x}^{2} - \frac{1}{6}, x\right)}, x\right) \]
        8. lower-pow.f64N/A

          \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(\color{blue}{{x}^{3}}, \frac{3}{40} \cdot {x}^{2} - \frac{1}{6}, x\right), x\right) \]
        9. lower--.f64N/A

          \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left({x}^{3}, \color{blue}{\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}}, x\right), x\right) \]
        10. lower-*.f64N/A

          \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left({x}^{3}, \color{blue}{\frac{3}{40} \cdot {x}^{2}} - \frac{1}{6}, x\right), x\right) \]
        11. unpow2N/A

          \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left({x}^{3}, \frac{3}{40} \cdot \color{blue}{\left(x \cdot x\right)} - \frac{1}{6}, x\right), x\right) \]
        12. lower-*.f6452.2

          \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left({x}^{3}, 0.075 \cdot \color{blue}{\left(x \cdot x\right)} - 0.16666666666666666, x\right), x\right) \]
      7. Applied rewrites52.2%

        \[\leadsto \mathsf{copysign}\left(\color{blue}{\mathsf{fma}\left({x}^{3}, 0.075 \cdot \left(x \cdot x\right) - 0.16666666666666666, x\right)}, x\right) \]
      8. Step-by-step derivation
        1. Applied rewrites52.2%

          \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(\left(\left(x \cdot x\right) \cdot 0.075 - 0.16666666666666666\right) \cdot \left(x \cdot x\right), \color{blue}{x}, x\right), x\right) \]
        2. Add Preprocessing

        Alternative 4: 51.9% accurate, 1.9× speedup?

        \[\begin{array}{l} \\ \mathsf{copysign}\left(\mathsf{fma}\left(-0.16666666666666666 \cdot x, x, 1\right) \cdot x, x\right) \end{array} \]
        (FPCore (x)
         :precision binary64
         (copysign (* (fma (* -0.16666666666666666 x) x 1.0) x) x))
        double code(double x) {
        	return copysign((fma((-0.16666666666666666 * x), x, 1.0) * x), x);
        }
        
        function code(x)
        	return copysign(Float64(fma(Float64(-0.16666666666666666 * x), x, 1.0) * x), x)
        end
        
        code[x_] := N[With[{TMP1 = Abs[N[(N[(N[(-0.16666666666666666 * x), $MachinePrecision] * x + 1.0), $MachinePrecision] * x), $MachinePrecision]], TMP2 = Sign[x]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision]
        
        \begin{array}{l}
        
        \\
        \mathsf{copysign}\left(\mathsf{fma}\left(-0.16666666666666666 \cdot x, x, 1\right) \cdot x, x\right)
        \end{array}
        
        Derivation
        1. Initial program 29.5%

          \[\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \]
        2. Add Preprocessing
        3. Step-by-step derivation
          1. lift-log.f64N/A

            \[\leadsto \mathsf{copysign}\left(\color{blue}{\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right)}, x\right) \]
          2. lift-+.f64N/A

            \[\leadsto \mathsf{copysign}\left(\log \color{blue}{\left(\left|x\right| + \sqrt{x \cdot x + 1}\right)}, x\right) \]
          3. lift-sqrt.f64N/A

            \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \color{blue}{\sqrt{x \cdot x + 1}}\right), x\right) \]
          4. lift-+.f64N/A

            \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x + 1}}\right), x\right) \]
          5. lift-*.f64N/A

            \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x} + 1}\right), x\right) \]
          6. sqr-abs-revN/A

            \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{\left|x\right| \cdot \left|x\right|} + 1}\right), x\right) \]
          7. lift-fabs.f64N/A

            \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{\left|x\right|} \cdot \left|x\right| + 1}\right), x\right) \]
          8. lift-fabs.f64N/A

            \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\left|x\right| \cdot \color{blue}{\left|x\right|} + 1}\right), x\right) \]
          9. asinh-def-revN/A

            \[\leadsto \mathsf{copysign}\left(\color{blue}{\sinh^{-1} \left(\left|x\right|\right)}, x\right) \]
          10. lower-asinh.f6499.8

            \[\leadsto \mathsf{copysign}\left(\color{blue}{\sinh^{-1} \left(\left|x\right|\right)}, x\right) \]
          11. lift-fabs.f64N/A

            \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left(\left|x\right|\right)}, x\right) \]
          12. rem-sqrt-square-revN/A

            \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left(\sqrt{x \cdot x}\right)}, x\right) \]
          13. pow2N/A

            \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left(\sqrt{\color{blue}{{x}^{2}}}\right), x\right) \]
          14. sqrt-pow1N/A

            \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{\left({x}^{\left(\frac{2}{2}\right)}\right)}, x\right) \]
          15. metadata-evalN/A

            \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left({x}^{\color{blue}{1}}\right), x\right) \]
          16. unpow199.8

            \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \color{blue}{x}, x\right) \]
        4. Applied rewrites99.8%

          \[\leadsto \color{blue}{\mathsf{copysign}\left(\sinh^{-1} x, x\right)} \]
        5. Taylor expanded in x around 0

          \[\leadsto \mathsf{copysign}\left(\color{blue}{x \cdot \left(1 + \frac{-1}{6} \cdot {x}^{2}\right)}, x\right) \]
        6. Step-by-step derivation
          1. +-commutativeN/A

            \[\leadsto \mathsf{copysign}\left(x \cdot \color{blue}{\left(\frac{-1}{6} \cdot {x}^{2} + 1\right)}, x\right) \]
          2. distribute-lft-inN/A

            \[\leadsto \mathsf{copysign}\left(\color{blue}{x \cdot \left(\frac{-1}{6} \cdot {x}^{2}\right) + x \cdot 1}, x\right) \]
          3. *-commutativeN/A

            \[\leadsto \mathsf{copysign}\left(x \cdot \color{blue}{\left({x}^{2} \cdot \frac{-1}{6}\right)} + x \cdot 1, x\right) \]
          4. associate-*r*N/A

            \[\leadsto \mathsf{copysign}\left(\color{blue}{\left(x \cdot {x}^{2}\right) \cdot \frac{-1}{6}} + x \cdot 1, x\right) \]
          5. unpow2N/A

            \[\leadsto \mathsf{copysign}\left(\left(x \cdot \color{blue}{\left(x \cdot x\right)}\right) \cdot \frac{-1}{6} + x \cdot 1, x\right) \]
          6. cube-multN/A

            \[\leadsto \mathsf{copysign}\left(\color{blue}{{x}^{3}} \cdot \frac{-1}{6} + x \cdot 1, x\right) \]
          7. *-rgt-identityN/A

            \[\leadsto \mathsf{copysign}\left({x}^{3} \cdot \frac{-1}{6} + \color{blue}{x}, x\right) \]
          8. lower-fma.f64N/A

            \[\leadsto \mathsf{copysign}\left(\color{blue}{\mathsf{fma}\left({x}^{3}, \frac{-1}{6}, x\right)}, x\right) \]
          9. lower-pow.f6452.0

            \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(\color{blue}{{x}^{3}}, -0.16666666666666666, x\right), x\right) \]
        7. Applied rewrites52.0%

          \[\leadsto \mathsf{copysign}\left(\color{blue}{\mathsf{fma}\left({x}^{3}, -0.16666666666666666, x\right)}, x\right) \]
        8. Step-by-step derivation
          1. Applied rewrites52.0%

            \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(-0.16666666666666666 \cdot \left(x \cdot x\right), \color{blue}{x}, x\right), x\right) \]
          2. Step-by-step derivation
            1. Applied rewrites52.0%

              \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(-0.16666666666666666 \cdot x, x, 1\right) \cdot \color{blue}{x}, x\right) \]
            2. Add Preprocessing

            Developer Target 1: 100.0% accurate, 0.6× speedup?

            \[\begin{array}{l} \\ \begin{array}{l} t_0 := \frac{1}{\left|x\right|}\\ \mathsf{copysign}\left(\mathsf{log1p}\left(\left|x\right| + \frac{\left|x\right|}{\mathsf{hypot}\left(1, t\_0\right) + t\_0}\right), x\right) \end{array} \end{array} \]
            (FPCore (x)
             :precision binary64
             (let* ((t_0 (/ 1.0 (fabs x))))
               (copysign (log1p (+ (fabs x) (/ (fabs x) (+ (hypot 1.0 t_0) t_0)))) x)))
            double code(double x) {
            	double t_0 = 1.0 / fabs(x);
            	return copysign(log1p((fabs(x) + (fabs(x) / (hypot(1.0, t_0) + t_0)))), x);
            }
            
            public static double code(double x) {
            	double t_0 = 1.0 / Math.abs(x);
            	return Math.copySign(Math.log1p((Math.abs(x) + (Math.abs(x) / (Math.hypot(1.0, t_0) + t_0)))), x);
            }
            
            def code(x):
            	t_0 = 1.0 / math.fabs(x)
            	return math.copysign(math.log1p((math.fabs(x) + (math.fabs(x) / (math.hypot(1.0, t_0) + t_0)))), x)
            
            function code(x)
            	t_0 = Float64(1.0 / abs(x))
            	return copysign(log1p(Float64(abs(x) + Float64(abs(x) / Float64(hypot(1.0, t_0) + t_0)))), x)
            end
            
            code[x_] := Block[{t$95$0 = N[(1.0 / N[Abs[x], $MachinePrecision]), $MachinePrecision]}, N[With[{TMP1 = Abs[N[Log[1 + N[(N[Abs[x], $MachinePrecision] + N[(N[Abs[x], $MachinePrecision] / N[(N[Sqrt[1.0 ^ 2 + t$95$0 ^ 2], $MachinePrecision] + t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], TMP2 = Sign[x]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision]]
            
            \begin{array}{l}
            
            \\
            \begin{array}{l}
            t_0 := \frac{1}{\left|x\right|}\\
            \mathsf{copysign}\left(\mathsf{log1p}\left(\left|x\right| + \frac{\left|x\right|}{\mathsf{hypot}\left(1, t\_0\right) + t\_0}\right), x\right)
            \end{array}
            \end{array}
            

            Reproduce

            ?
            herbie shell --seed 2024346 
            (FPCore (x)
              :name "Rust f64::asinh"
              :precision binary64
            
              :alt
              (! :herbie-platform default (let* ((ax (fabs x)) (ix (/ 1 ax))) (copysign (log1p (+ ax (/ ax (+ (hypot 1 ix) ix)))) x)))
            
              (copysign (log (+ (fabs x) (sqrt (+ (* x x) 1.0)))) x))