Rust f64::asinh

Percentage Accurate: 31.3% → 99.8%
Time: 1.9s
Alternatives: 5
Speedup: 2.2×

Specification

?
\[\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}

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 5 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: 31.3% 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 31.3%

    \[\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \]
  2. 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-fabs.f64N/A

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

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \color{blue}{\sqrt{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. lift-*.f64N/A

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

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

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

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{{x}^{2} + 1}}\right), x\right) \]
    10. pow2N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x} + 1}\right), x\right) \]
    11. 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) \]
    12. asinh-def-revN/A

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

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

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

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

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left({x}^{\color{blue}{1}}\right), x\right) \]
    17. unpow1N/A

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

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

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

Alternative 2: 51.4% accurate, 1.6× speedup?

\[\begin{array}{l} \\ \mathsf{copysign}\left(\mathsf{fma}\left(\mathsf{fma}\left(-0.044642857142857144, x \cdot x, 0.075\right) \cdot \left(x \cdot x\right) - 0.16666666666666666, x \cdot x, 1\right) \cdot x, x\right) \end{array} \]
(FPCore (x)
 :precision binary64
 (copysign
  (*
   (fma
    (-
     (* (fma -0.044642857142857144 (* x x) 0.075) (* x x))
     0.16666666666666666)
    (* x x)
    1.0)
   x)
  x))
double code(double x) {
	return copysign((fma(((fma(-0.044642857142857144, (x * x), 0.075) * (x * x)) - 0.16666666666666666), (x * x), 1.0) * x), x);
}
function code(x)
	return copysign(Float64(fma(Float64(Float64(fma(-0.044642857142857144, Float64(x * x), 0.075) * Float64(x * x)) - 0.16666666666666666), Float64(x * x), 1.0) * x), x)
end
code[x_] := N[With[{TMP1 = Abs[N[(N[(N[(N[(N[(-0.044642857142857144 * N[(x * x), $MachinePrecision] + 0.075), $MachinePrecision] * N[(x * x), $MachinePrecision]), $MachinePrecision] - 0.16666666666666666), $MachinePrecision] * N[(x * x), $MachinePrecision] + 1.0), $MachinePrecision] * 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.044642857142857144, x \cdot x, 0.075\right) \cdot \left(x \cdot x\right) - 0.16666666666666666, x \cdot x, 1\right) \cdot x, x\right)
\end{array}
Derivation
  1. Initial program 31.3%

    \[\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \]
  2. 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-fabs.f64N/A

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

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \color{blue}{\sqrt{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. lift-*.f64N/A

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

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

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

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{{x}^{2} + 1}}\right), x\right) \]
    10. pow2N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x} + 1}\right), x\right) \]
    11. 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) \]
    12. asinh-def-revN/A

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

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

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

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

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left({x}^{\color{blue}{1}}\right), x\right) \]
    17. unpow1N/A

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

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

    \[\leadsto \color{blue}{\mathsf{copysign}\left(\sinh^{-1} x, x\right)} \]
  4. 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) \]
  5. Step-by-step derivation
    1. unpow1N/A

      \[\leadsto \mathsf{copysign}\left(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) \]
    2. metadata-evalN/A

      \[\leadsto \mathsf{copysign}\left(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) \]
    3. sqrt-pow1N/A

      \[\leadsto \mathsf{copysign}\left(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) \]
    4. pow2N/A

      \[\leadsto \mathsf{copysign}\left(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) \]
    5. rem-sqrt-square-revN/A

      \[\leadsto \mathsf{copysign}\left(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. asinh-def-revN/A

      \[\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) \]
    7. sqr-abs-revN/A

      \[\leadsto \mathsf{copysign}\left(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) \]
    8. pow2N/A

      \[\leadsto \mathsf{copysign}\left(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) \]
    9. +-commutativeN/A

      \[\leadsto \mathsf{copysign}\left(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) \]
    10. +-commutativeN/A

      \[\leadsto \mathsf{copysign}\left(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) \]
    11. pow2N/A

      \[\leadsto \mathsf{copysign}\left(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) \]
    12. *-commutativeN/A

      \[\leadsto \mathsf{copysign}\left(\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) \cdot \color{blue}{x}, x\right) \]
    13. lower-*.f64N/A

      \[\leadsto \mathsf{copysign}\left(\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) \cdot \color{blue}{x}, x\right) \]
  6. Applied rewrites51.4%

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

Alternative 3: 51.4% accurate, 1.7× speedup?

\[\begin{array}{l} \\ \mathsf{copysign}\left(\mathsf{fma}\left(0.075 \cdot \left(x \cdot x\right) - 0.16666666666666666, x \cdot x, 1\right) \cdot x, x\right) \end{array} \]
(FPCore (x)
 :precision binary64
 (copysign
  (* (fma (- (* 0.075 (* x x)) 0.16666666666666666) (* x x) 1.0) x)
  x))
double code(double x) {
	return copysign((fma(((0.075 * (x * x)) - 0.16666666666666666), (x * x), 1.0) * x), x);
}
function code(x)
	return copysign(Float64(fma(Float64(Float64(0.075 * Float64(x * x)) - 0.16666666666666666), Float64(x * x), 1.0) * x), x)
end
code[x_] := N[With[{TMP1 = Abs[N[(N[(N[(N[(0.075 * N[(x * x), $MachinePrecision]), $MachinePrecision] - 0.16666666666666666), $MachinePrecision] * N[(x * x), $MachinePrecision] + 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.075 \cdot \left(x \cdot x\right) - 0.16666666666666666, x \cdot x, 1\right) \cdot x, x\right)
\end{array}
Derivation
  1. Initial program 31.3%

    \[\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \]
  2. 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-fabs.f64N/A

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

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \color{blue}{\sqrt{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. lift-*.f64N/A

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

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

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

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{{x}^{2} + 1}}\right), x\right) \]
    10. pow2N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x} + 1}\right), x\right) \]
    11. 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) \]
    12. asinh-def-revN/A

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

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

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

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

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left({x}^{\color{blue}{1}}\right), x\right) \]
    17. unpow1N/A

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

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

    \[\leadsto \color{blue}{\mathsf{copysign}\left(\sinh^{-1} x, x\right)} \]
  4. 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) \]
  5. Step-by-step derivation
    1. unpow1N/A

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

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

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

      \[\leadsto \mathsf{copysign}\left(x \cdot \left(1 + {x}^{2} \cdot \left(\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}\right)\right), x\right) \]
    5. rem-sqrt-square-revN/A

      \[\leadsto \mathsf{copysign}\left(x \cdot \left(1 + {x}^{2} \cdot \left(\frac{3}{40} \cdot {x}^{2} - \frac{1}{6}\right)\right), x\right) \]
    6. asinh-def-revN/A

      \[\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) \]
    7. sqr-abs-revN/A

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

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

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

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

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

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

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

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

Alternative 4: 51.5% accurate, 1.9× speedup?

\[\begin{array}{l} \\ \mathsf{copysign}\left(\mathsf{fma}\left(-0.16666666666666666, x \cdot 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(-0.16666666666666666, Float64(x * x), 1.0) * x), x)
end
code[x_] := N[With[{TMP1 = Abs[N[(N[(-0.16666666666666666 * N[(x * x), $MachinePrecision] + 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, x \cdot x, 1\right) \cdot x, x\right)
\end{array}
Derivation
  1. Initial program 31.3%

    \[\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \]
  2. 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-fabs.f64N/A

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

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \color{blue}{\sqrt{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. lift-*.f64N/A

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

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

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

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{{x}^{2} + 1}}\right), x\right) \]
    10. pow2N/A

      \[\leadsto \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{x \cdot x} + 1}\right), x\right) \]
    11. 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) \]
    12. asinh-def-revN/A

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

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

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

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

      \[\leadsto \mathsf{copysign}\left(\sinh^{-1} \left({x}^{\color{blue}{1}}\right), x\right) \]
    17. unpow1N/A

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

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

    \[\leadsto \color{blue}{\mathsf{copysign}\left(\sinh^{-1} x, x\right)} \]
  4. 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) \]
  5. Step-by-step derivation
    1. unpow1N/A

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

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

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

      \[\leadsto \mathsf{copysign}\left(x \cdot \left(1 + \frac{-1}{6} \cdot {x}^{2}\right), x\right) \]
    5. rem-sqrt-square-revN/A

      \[\leadsto \mathsf{copysign}\left(x \cdot \left(1 + \frac{-1}{6} \cdot {x}^{2}\right), x\right) \]
    6. asinh-def-revN/A

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

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

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

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

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

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

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

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

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

      \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(\frac{-1}{6}, {x}^{2}, 1\right) \cdot x, x\right) \]
    16. pow2N/A

      \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(\frac{-1}{6}, x \cdot x, 1\right) \cdot x, x\right) \]
    17. lift-*.f6451.5

      \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(-0.16666666666666666, x \cdot x, 1\right) \cdot x, x\right) \]
  6. Applied rewrites51.5%

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

Alternative 5: 52.1% accurate, 2.2× speedup?

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

\\
\mathsf{copysign}\left(x, x\right)
\end{array}
Derivation
  1. Initial program 31.3%

    \[\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right) \]
  2. Taylor expanded in x around 0

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

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

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

      \[\leadsto \mathsf{copysign}\left(\mathsf{fma}\left(\frac{-1}{24} \cdot \left({x}^{2} \cdot \left(3 \cdot \frac{1}{1 + \left|x\right|} + 3 \cdot \frac{1}{{\left(1 + \left|x\right|\right)}^{2}}\right)\right) + \frac{1}{2} \cdot \frac{1}{1 + \left|x\right|}, \color{blue}{{x}^{2}}, \log \left(1 + \left|x\right|\right)\right), x\right) \]
  4. Applied rewrites50.5%

    \[\leadsto \mathsf{copysign}\left(\color{blue}{\mathsf{fma}\left(\mathsf{fma}\left(-0.041666666666666664 \cdot \left(x \cdot x\right), \mathsf{fma}\left({\left(1 + x\right)}^{-2}, 3, \frac{3}{1 + x}\right), \frac{0.5}{1 + x}\right), x \cdot x, \mathsf{log1p}\left(x\right)\right)}, x\right) \]
  5. Taylor expanded in x around 0

    \[\leadsto \mathsf{copysign}\left(x, x\right) \]
  6. Step-by-step derivation
    1. Applied rewrites52.1%

      \[\leadsto \mathsf{copysign}\left(x, x\right) \]
    2. Add Preprocessing

    Developer Target 1: 99.9% 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 2025101 
    (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))