Average Error: 0.1 → 0.1
Time: 18.5s
Precision: 64
\[\left(\left(-\mathsf{expm1}\left(x\right)\right) \cdot \left(-\mathsf{expm1}\left(y\right)\right)\right) \cdot \left(-\mathsf{expm1}\left(z\right)\right)\]
\[\left(-\mathsf{expm1}\left(z\right)\right) \cdot \left(\mathsf{expm1}\left(y\right) \cdot \mathsf{expm1}\left(x\right)\right)\]
\left(\left(-\mathsf{expm1}\left(x\right)\right) \cdot \left(-\mathsf{expm1}\left(y\right)\right)\right) \cdot \left(-\mathsf{expm1}\left(z\right)\right)
\left(-\mathsf{expm1}\left(z\right)\right) \cdot \left(\mathsf{expm1}\left(y\right) \cdot \mathsf{expm1}\left(x\right)\right)
double f(double x, double y, double z) {
        double r443262 = x;
        double r443263 = expm1(r443262);
        double r443264 = -r443263;
        double r443265 = y;
        double r443266 = expm1(r443265);
        double r443267 = -r443266;
        double r443268 = r443264 * r443267;
        double r443269 = z;
        double r443270 = expm1(r443269);
        double r443271 = -r443270;
        double r443272 = r443268 * r443271;
        return r443272;
}

double f(double x, double y, double z) {
        double r443273 = z;
        double r443274 = expm1(r443273);
        double r443275 = -r443274;
        double r443276 = y;
        double r443277 = expm1(r443276);
        double r443278 = x;
        double r443279 = expm1(r443278);
        double r443280 = r443277 * r443279;
        double r443281 = r443275 * r443280;
        return r443281;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Initial program 0.1

    \[\left(\left(-\mathsf{expm1}\left(x\right)\right) \cdot \left(-\mathsf{expm1}\left(y\right)\right)\right) \cdot \left(-\mathsf{expm1}\left(z\right)\right)\]
  2. Final simplification0.1

    \[\leadsto \left(-\mathsf{expm1}\left(z\right)\right) \cdot \left(\mathsf{expm1}\left(y\right) \cdot \mathsf{expm1}\left(x\right)\right)\]

Reproduce

herbie shell --seed 1 
(FPCore (x y z)
  :name "(-expm1(x))*(-expm1(y))*(-expm1(z))"
  :precision binary64
  (* (* (- (expm1 x)) (- (expm1 y))) (- (expm1 z))))