\frac{e^{x} - 1}{x}\begin{array}{l}
\mathbf{if}\;\frac{e^{x} - 1}{x} \leq 0:\\
\;\;\;\;1 + x \cdot \left(0.5 + x \cdot 0.16666666666666666\right)\\
\mathbf{elif}\;\frac{e^{x} - 1}{x} \leq 0.9991313213421796:\\
\;\;\;\;\frac{1}{\frac{x}{e^{x} - 1}}\\
\mathbf{elif}\;\frac{e^{x} - 1}{x} \leq 1.1353713195078663:\\
\;\;\;\;1 + x \cdot \left(0.5 + x \cdot 0.16666666666666666\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(e^{x} - 1\right) + \log 1}{x}\\
\end{array}(FPCore (x) :precision binary64 (/ (- (exp x) 1.0) x))
(FPCore (x)
:precision binary64
(if (<= (/ (- (exp x) 1.0) x) 0.0)
(+ 1.0 (* x (+ 0.5 (* x 0.16666666666666666))))
(if (<= (/ (- (exp x) 1.0) x) 0.9991313213421796)
(/ 1.0 (/ x (- (exp x) 1.0)))
(if (<= (/ (- (exp x) 1.0) x) 1.1353713195078663)
(+ 1.0 (* x (+ 0.5 (* x 0.16666666666666666))))
(/ (+ (- (exp x) 1.0) (log 1.0)) x)))))double code(double x) {
return (exp(x) - 1.0) / x;
}
double code(double x) {
double tmp;
if (((exp(x) - 1.0) / x) <= 0.0) {
tmp = 1.0 + (x * (0.5 + (x * 0.16666666666666666)));
} else if (((exp(x) - 1.0) / x) <= 0.9991313213421796) {
tmp = 1.0 / (x / (exp(x) - 1.0));
} else if (((exp(x) - 1.0) / x) <= 1.1353713195078663) {
tmp = 1.0 + (x * (0.5 + (x * 0.16666666666666666)));
} else {
tmp = ((exp(x) - 1.0) + log(1.0)) / x;
}
return tmp;
}




Bits error versus x
Results
| Original | 40.2 |
|---|---|
| Target | 40.6 |
| Herbie | 0.3 |
if (/.f64 (-.f64 (exp.f64 x) 1) x) < -0.0 or 0.999131321342179635 < (/.f64 (-.f64 (exp.f64 x) 1) x) < 1.13537131950786629Initial program 60.4
Taylor expanded around 0 0.2
Simplified0.2
if -0.0 < (/.f64 (-.f64 (exp.f64 x) 1) x) < 0.999131321342179635Initial program 0.4
rmApplied clear-num_binary64_28050.4
if 1.13537131950786629 < (/.f64 (-.f64 (exp.f64 x) 1) x) Initial program 3.5
rmApplied add-log-exp_binary64_28453.5
Applied add-log-exp_binary64_284536.8
Applied diff-log_binary64_289836.8
Simplified36.4
rmApplied *-un-lft-identity_binary64_280636.4
Applied log-prod_binary64_289236.4
Simplified3.5
Final simplification0.3
herbie shell --seed 2021076
(FPCore (x)
:name "Kahan's exp quotient"
:precision binary64
:herbie-target
(if (and (< x 1.0) (> x -1.0)) (/ (- (exp x) 1.0) (log (exp x))) (/ (- (exp x) 1.0) x))
(/ (- (exp x) 1.0) x))