Average Error: 40.2 → 0.0
Time: 12.9s
Precision: binary64
\[\frac{e^{x} - 1}{x} \]
\[\frac{\mathsf{expm1}\left(x\right)}{x} \]
\frac{e^{x} - 1}{x}
\frac{\mathsf{expm1}\left(x\right)}{x}
(FPCore (x) :precision binary64 (/ (- (exp x) 1.0) x))
(FPCore (x) :precision binary64 (/ (expm1 x) x))
double code(double x) {
	return (exp(x) - 1.0) / x;
}
double code(double x) {
	return expm1(x) / x;
}

Error

Bits error versus x

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original40.2
Target40.7
Herbie0.0
\[\begin{array}{l} \mathbf{if}\;x < 1 \land x > -1:\\ \;\;\;\;\frac{e^{x} - 1}{\log \left(e^{x}\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{e^{x} - 1}{x}\\ \end{array} \]

Derivation

  1. Initial program 40.2

    \[\frac{e^{x} - 1}{x} \]
  2. Simplified0.0

    \[\leadsto \color{blue}{\frac{\mathsf{expm1}\left(x\right)}{x}} \]
    Proof
    (/.f64 (-.f64 (exp.f64 x) 1) x): 0 points increase in error, 0 points decrease in error
    (Rewrite=> div-sub_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))): 5 points increase in error, 4 points decrease in error
    (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 (exp.f64 x) x) (neg.f64 (/.f64 1 x)))): 0 points increase in error, 0 points decrease in error
    (Rewrite=> +-commutative_binary64 (+.f64 (neg.f64 (/.f64 1 x)) (/.f64 (exp.f64 x) x))): 0 points increase in error, 0 points decrease in error
    (+.f64 (Rewrite=> neg-sub0_binary64 (-.f64 0 (/.f64 1 x))) (/.f64 (exp.f64 x) x)): 0 points increase in error, 0 points decrease in error
    (Rewrite=> associate-+l-_binary64 (-.f64 0 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))): 0 points increase in error, 0 points decrease in error
    (Rewrite=> sub0-neg_binary64 (neg.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))): 0 points increase in error, 0 points decrease in error
    (Rewrite=> neg-mul-1_binary64 (*.f64 -1 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (Rewrite<= metadata-eval (neg.f64 1)) (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 1 x) (neg.f64 (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite=> +-commutative_binary64 (+.f64 (neg.f64 (/.f64 (exp.f64 x) x)) (/.f64 1 x)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 (Rewrite=> neg-sub0_binary64 (-.f64 0 (/.f64 (exp.f64 x) x))) (/.f64 1 x))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite=> associate-+l-_binary64 (-.f64 0 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite<= div-sub_binary64 (/.f64 (-.f64 (exp.f64 x) 1) x)))): 4 points increase in error, 5 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite=> div-sub_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))))): 5 points increase in error, 4 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 (exp.f64 x) x) (neg.f64 (/.f64 1 x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite=> +-commutative_binary64 (+.f64 (neg.f64 (/.f64 1 x)) (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (+.f64 (Rewrite=> neg-sub0_binary64 (-.f64 0 (/.f64 1 x))) (/.f64 (exp.f64 x) x)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite=> associate-+l-_binary64 (-.f64 0 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite=> sub0-neg_binary64 (neg.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite=> neg-mul-1_binary64 (*.f64 -1 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (*.f64 (Rewrite<= metadata-eval (neg.f64 1)) (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite=> *-commutative_binary64 (*.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)) (neg.f64 1))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite=> cancel-sign-sub-inv_binary64 (+.f64 0 (*.f64 (neg.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))) (neg.f64 1))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite<= sub0-neg_binary64 (-.f64 0 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite<= associate-+l-_binary64 (+.f64 (-.f64 0 (/.f64 1 x)) (/.f64 (exp.f64 x) x))) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (+.f64 (Rewrite<= neg-sub0_binary64 (neg.f64 (/.f64 1 x))) (/.f64 (exp.f64 x) x)) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite<= +-commutative_binary64 (+.f64 (/.f64 (exp.f64 x) x) (neg.f64 (/.f64 1 x)))) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite<= sub-neg_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite<= div-sub_binary64 (/.f64 (-.f64 (exp.f64 x) 1) x)) (neg.f64 1)))): 4 points increase in error, 5 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite=> +-lft-identity_binary64 (*.f64 (/.f64 (-.f64 (exp.f64 x) 1) x) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite<= +-lft-identity_binary64 (+.f64 0 (*.f64 (/.f64 (-.f64 (exp.f64 x) 1) x) (neg.f64 1))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite=> div-sub_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))) (neg.f64 1)))): 5 points increase in error, 4 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 (exp.f64 x) x) (neg.f64 (/.f64 1 x)))) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite=> +-commutative_binary64 (+.f64 (neg.f64 (/.f64 1 x)) (/.f64 (exp.f64 x) x))) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (+.f64 (Rewrite=> neg-sub0_binary64 (-.f64 0 (/.f64 1 x))) (/.f64 (exp.f64 x) x)) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite=> associate-+l-_binary64 (-.f64 0 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 0 (*.f64 (Rewrite=> sub0-neg_binary64 (neg.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))) (neg.f64 1)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite<= cancel-sign-sub-inv_binary64 (-.f64 0 (*.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)) (neg.f64 1))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite<= *-commutative_binary64 (*.f64 (neg.f64 1) (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (*.f64 (Rewrite=> metadata-eval -1) (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite<= neg-mul-1_binary64 (neg.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite<= sub0-neg_binary64 (-.f64 0 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite<= associate-+l-_binary64 (+.f64 (-.f64 0 (/.f64 1 x)) (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (+.f64 (Rewrite<= neg-sub0_binary64 (neg.f64 (/.f64 1 x))) (/.f64 (exp.f64 x) x)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite<= +-commutative_binary64 (+.f64 (/.f64 (exp.f64 x) x) (neg.f64 (/.f64 1 x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite<= sub-neg_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite<= div-sub_binary64 (/.f64 (-.f64 (exp.f64 x) 1) x)))): 4 points increase in error, 5 points decrease in error
    (*.f64 (neg.f64 1) (-.f64 0 (Rewrite=> div-sub_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))))): 5 points increase in error, 4 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite<= associate-+l-_binary64 (+.f64 (-.f64 0 (/.f64 (exp.f64 x) x)) (/.f64 1 x)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (+.f64 (Rewrite<= neg-sub0_binary64 (neg.f64 (/.f64 (exp.f64 x) x))) (/.f64 1 x))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite<= +-commutative_binary64 (+.f64 (/.f64 1 x) (neg.f64 (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite<= sub-neg_binary64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite<= *-lft-identity_binary64 (*.f64 1 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (*.f64 1 (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 1 x) (neg.f64 (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (*.f64 1 (Rewrite=> +-commutative_binary64 (+.f64 (neg.f64 (/.f64 (exp.f64 x) x)) (/.f64 1 x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (*.f64 1 (+.f64 (Rewrite=> neg-sub0_binary64 (-.f64 0 (/.f64 (exp.f64 x) x))) (/.f64 1 x)))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (*.f64 1 (Rewrite=> associate-+l-_binary64 (-.f64 0 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x)))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (*.f64 1 (-.f64 0 (Rewrite<= div-sub_binary64 (/.f64 (-.f64 (exp.f64 x) 1) x))))): 4 points increase in error, 5 points decrease in error
    (*.f64 (neg.f64 1) (*.f64 1 (Rewrite=> sub0-neg_binary64 (neg.f64 (/.f64 (-.f64 (exp.f64 x) 1) x))))): 0 points increase in error, 0 points decrease in error
    (*.f64 (neg.f64 1) (Rewrite=> distribute-rgt-neg-out_binary64 (neg.f64 (*.f64 1 (/.f64 (-.f64 (exp.f64 x) 1) x))))): 0 points increase in error, 0 points decrease in error
    (Rewrite=> distribute-rgt-neg-out_binary64 (neg.f64 (*.f64 (neg.f64 1) (*.f64 1 (/.f64 (-.f64 (exp.f64 x) 1) x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (Rewrite=> metadata-eval -1) (*.f64 1 (/.f64 (-.f64 (exp.f64 x) 1) x)))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (Rewrite<= neg-mul-1_binary64 (neg.f64 (*.f64 1 (/.f64 (-.f64 (exp.f64 x) 1) x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (Rewrite<= distribute-rgt-neg-out_binary64 (*.f64 1 (neg.f64 (/.f64 (-.f64 (exp.f64 x) 1) x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 1 (Rewrite<= sub0-neg_binary64 (-.f64 0 (/.f64 (-.f64 (exp.f64 x) 1) x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 1 (-.f64 0 (Rewrite=> div-sub_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x)))))): 5 points increase in error, 4 points decrease in error
    (neg.f64 (*.f64 1 (Rewrite<= associate-+l-_binary64 (+.f64 (-.f64 0 (/.f64 (exp.f64 x) x)) (/.f64 1 x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 1 (+.f64 (Rewrite<= neg-sub0_binary64 (neg.f64 (/.f64 (exp.f64 x) x))) (/.f64 1 x)))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 1 (Rewrite<= +-commutative_binary64 (+.f64 (/.f64 1 x) (neg.f64 (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 1 (Rewrite<= sub-neg_binary64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (Rewrite=> *-lft-identity_binary64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 1 x) (neg.f64 (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (Rewrite=> +-commutative_binary64 (+.f64 (neg.f64 (/.f64 (exp.f64 x) x)) (/.f64 1 x)))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (+.f64 (Rewrite=> neg-sub0_binary64 (-.f64 0 (/.f64 (exp.f64 x) x))) (/.f64 1 x))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (Rewrite=> associate-+l-_binary64 (-.f64 0 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (-.f64 0 (Rewrite<= div-sub_binary64 (/.f64 (-.f64 (exp.f64 x) 1) x)))): 4 points increase in error, 5 points decrease in error
    (neg.f64 (Rewrite=> sub0-neg_binary64 (neg.f64 (/.f64 (-.f64 (exp.f64 x) 1) x)))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (neg.f64 (Rewrite=> div-sub_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))))): 5 points increase in error, 4 points decrease in error
    (neg.f64 (neg.f64 (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 (exp.f64 x) x) (neg.f64 (/.f64 1 x)))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (neg.f64 (Rewrite=> +-commutative_binary64 (+.f64 (neg.f64 (/.f64 1 x)) (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (neg.f64 (+.f64 (Rewrite=> neg-sub0_binary64 (-.f64 0 (/.f64 1 x))) (/.f64 (exp.f64 x) x)))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (neg.f64 (Rewrite=> associate-+l-_binary64 (-.f64 0 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (neg.f64 (Rewrite=> sub0-neg_binary64 (neg.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (neg.f64 (Rewrite=> neg-mul-1_binary64 (*.f64 -1 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (neg.f64 (*.f64 (Rewrite<= metadata-eval (neg.f64 1)) (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (neg.f64 (Rewrite=> *-commutative_binary64 (*.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)) (neg.f64 1))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (Rewrite=> distribute-rgt-neg-in_binary64 (*.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)) (neg.f64 (neg.f64 1))))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)) (neg.f64 (Rewrite=> metadata-eval -1)))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)) (Rewrite=> metadata-eval 1))): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 1 x) (neg.f64 (/.f64 (exp.f64 x) x)))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (Rewrite=> +-commutative_binary64 (+.f64 (neg.f64 (/.f64 (exp.f64 x) x)) (/.f64 1 x))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (+.f64 (Rewrite=> neg-sub0_binary64 (-.f64 0 (/.f64 (exp.f64 x) x))) (/.f64 1 x)) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (Rewrite=> associate-+l-_binary64 (-.f64 0 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x)))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (Rewrite<= div-sub_binary64 (/.f64 (-.f64 (exp.f64 x) 1) x))) 1)): 4 points increase in error, 5 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (Rewrite=> div-sub_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x)))) 1)): 5 points increase in error, 4 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 (exp.f64 x) x) (neg.f64 (/.f64 1 x))))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (Rewrite=> +-commutative_binary64 (+.f64 (neg.f64 (/.f64 1 x)) (/.f64 (exp.f64 x) x)))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (+.f64 (Rewrite=> neg-sub0_binary64 (-.f64 0 (/.f64 1 x))) (/.f64 (exp.f64 x) x))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (Rewrite=> associate-+l-_binary64 (-.f64 0 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (Rewrite=> sub0-neg_binary64 (neg.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (Rewrite=> neg-mul-1_binary64 (*.f64 -1 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (*.f64 (Rewrite<= metadata-eval (neg.f64 1)) (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (-.f64 0 (Rewrite=> *-commutative_binary64 (*.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)) (neg.f64 1)))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (Rewrite=> cancel-sign-sub-inv_binary64 (+.f64 0 (*.f64 (neg.f64 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x))) (neg.f64 1)))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (+.f64 0 (*.f64 (Rewrite<= sub0-neg_binary64 (-.f64 0 (-.f64 (/.f64 1 x) (/.f64 (exp.f64 x) x)))) (neg.f64 1))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (+.f64 0 (*.f64 (Rewrite<= associate-+l-_binary64 (+.f64 (-.f64 0 (/.f64 1 x)) (/.f64 (exp.f64 x) x))) (neg.f64 1))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (+.f64 0 (*.f64 (+.f64 (Rewrite<= neg-sub0_binary64 (neg.f64 (/.f64 1 x))) (/.f64 (exp.f64 x) x)) (neg.f64 1))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (+.f64 0 (*.f64 (Rewrite<= +-commutative_binary64 (+.f64 (/.f64 (exp.f64 x) x) (neg.f64 (/.f64 1 x)))) (neg.f64 1))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (+.f64 0 (*.f64 (Rewrite<= sub-neg_binary64 (-.f64 (/.f64 (exp.f64 x) x) (/.f64 1 x))) (neg.f64 1))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (+.f64 0 (*.f64 (Rewrite<= div-sub_binary64 (/.f64 (-.f64 (exp.f64 x) 1) x)) (neg.f64 1))) 1)): 4 points increase in error, 5 points decrease in error
    (neg.f64 (*.f64 (Rewrite=> +-lft-identity_binary64 (*.f64 (/.f64 (-.f64 (exp.f64 x) 1) x) (neg.f64 1))) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (*.f64 (Rewrite=> associate-*l/_binary64 (/.f64 (*.f64 (-.f64 (exp.f64 x) 1) (neg.f64 1)) x)) 1)): 0 points increase in error, 0 points decrease in error
    (neg.f64 (Rewrite=> associate-*l/_binary64 (/.f64 (*.f64 (*.f64 (-.f64 (exp.f64 x) 1) (neg.f64 1)) 1) x))): 0 points increase in error, 0 points decrease in error
    (Rewrite=> distribute-neg-frac_binary64 (/.f64 (neg.f64 (*.f64 (*.f64 (-.f64 (exp.f64 x) 1) (neg.f64 1)) 1)) x)): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 (Rewrite=> *-commutative_binary64 (*.f64 (neg.f64 1) (-.f64 (exp.f64 x) 1))) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 (*.f64 (Rewrite=> metadata-eval -1) (-.f64 (exp.f64 x) 1)) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 (Rewrite<= neg-mul-1_binary64 (neg.f64 (-.f64 (exp.f64 x) 1))) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 (neg.f64 (Rewrite=> sub-neg_binary64 (+.f64 (exp.f64 x) (neg.f64 1)))) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 (Rewrite=> distribute-neg-in_binary64 (+.f64 (neg.f64 (exp.f64 x)) (neg.f64 (neg.f64 1)))) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 (+.f64 (neg.f64 (exp.f64 x)) (neg.f64 (Rewrite=> metadata-eval -1))) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 (+.f64 (neg.f64 (exp.f64 x)) (Rewrite=> metadata-eval 1)) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (Rewrite=> *-rgt-identity_binary64 (+.f64 (neg.f64 (exp.f64 x)) 1))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (Rewrite<= *-lft-identity_binary64 (*.f64 1 (+.f64 (neg.f64 (exp.f64 x)) 1)))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (+.f64 (neg.f64 (exp.f64 x)) (Rewrite<= metadata-eval (neg.f64 -1))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (+.f64 (neg.f64 (exp.f64 x)) (neg.f64 (Rewrite<= metadata-eval (neg.f64 1)))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (Rewrite<= distribute-neg-in_binary64 (neg.f64 (+.f64 (exp.f64 x) (neg.f64 1)))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (neg.f64 (Rewrite<= sub-neg_binary64 (-.f64 (exp.f64 x) 1))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (Rewrite=> neg-mul-1_binary64 (*.f64 -1 (-.f64 (exp.f64 x) 1))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (*.f64 (Rewrite<= metadata-eval (neg.f64 1)) (-.f64 (exp.f64 x) 1)))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (Rewrite<= *-commutative_binary64 (*.f64 (-.f64 (exp.f64 x) 1) (neg.f64 1))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (Rewrite=> *-commutative_binary64 (*.f64 (neg.f64 1) (-.f64 (exp.f64 x) 1))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (*.f64 (Rewrite=> metadata-eval -1) (-.f64 (exp.f64 x) 1)))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (Rewrite<= neg-mul-1_binary64 (neg.f64 (-.f64 (exp.f64 x) 1))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (neg.f64 (Rewrite=> sub-neg_binary64 (+.f64 (exp.f64 x) (neg.f64 1)))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (Rewrite=> distribute-neg-in_binary64 (+.f64 (neg.f64 (exp.f64 x)) (neg.f64 (neg.f64 1)))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (+.f64 (neg.f64 (exp.f64 x)) (neg.f64 (Rewrite=> metadata-eval -1))))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (neg.f64 (*.f64 1 (+.f64 (neg.f64 (exp.f64 x)) (Rewrite=> metadata-eval 1)))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (Rewrite<= distribute-rgt-neg-out_binary64 (*.f64 1 (neg.f64 (+.f64 (neg.f64 (exp.f64 x)) 1)))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (*.f64 1 (Rewrite<= sub0-neg_binary64 (-.f64 0 (+.f64 (neg.f64 (exp.f64 x)) 1)))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (*.f64 1 (Rewrite<= associate--l-_binary64 (-.f64 (-.f64 0 (neg.f64 (exp.f64 x))) 1))) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (*.f64 1 (-.f64 (Rewrite<= neg-sub0_binary64 (neg.f64 (neg.f64 (exp.f64 x)))) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (*.f64 1 (-.f64 (Rewrite=> remove-double-neg_binary64 (exp.f64 x)) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (Rewrite=> *-lft-identity_binary64 (-.f64 (exp.f64 x) 1)) x): 0 points increase in error, 0 points decrease in error
    (/.f64 (Rewrite=> expm1-def_binary64 (expm1.f64 x)) x): 0 points increase in error, 179 points decrease in error
  3. Final simplification0.0

    \[\leadsto \frac{\mathsf{expm1}\left(x\right)}{x} \]

Reproduce

herbie shell --seed 2022160 
(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))