
(FPCore (c x y) :precision binary64 (* c (log (+ 1.0 (* (- (pow (E) x) 1.0) y)))))
\begin{array}{l}
\\
c \cdot \log \left(1 + \left({\mathsf{E}\left(\right)}^{x} - 1\right) \cdot y\right)
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (c x y) :precision binary64 (* c (log (+ 1.0 (* (- (pow (E) x) 1.0) y)))))
\begin{array}{l}
\\
c \cdot \log \left(1 + \left({\mathsf{E}\left(\right)}^{x} - 1\right) \cdot y\right)
\end{array}
(FPCore (c x y) :precision binary64 (if (or (<= y -1.2e-21) (not (<= y 9.5e-78))) (* (log1p (* y (expm1 x))) c) (* (* (expm1 x) c) y)))
double code(double c, double x, double y) {
double tmp;
if ((y <= -1.2e-21) || !(y <= 9.5e-78)) {
tmp = log1p((y * expm1(x))) * c;
} else {
tmp = (expm1(x) * c) * y;
}
return tmp;
}
public static double code(double c, double x, double y) {
double tmp;
if ((y <= -1.2e-21) || !(y <= 9.5e-78)) {
tmp = Math.log1p((y * Math.expm1(x))) * c;
} else {
tmp = (Math.expm1(x) * c) * y;
}
return tmp;
}
def code(c, x, y): tmp = 0 if (y <= -1.2e-21) or not (y <= 9.5e-78): tmp = math.log1p((y * math.expm1(x))) * c else: tmp = (math.expm1(x) * c) * y return tmp
function code(c, x, y) tmp = 0.0 if ((y <= -1.2e-21) || !(y <= 9.5e-78)) tmp = Float64(log1p(Float64(y * expm1(x))) * c); else tmp = Float64(Float64(expm1(x) * c) * y); end return tmp end
code[c_, x_, y_] := If[Or[LessEqual[y, -1.2e-21], N[Not[LessEqual[y, 9.5e-78]], $MachinePrecision]], N[(N[Log[1 + N[(y * N[(Exp[x] - 1), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * c), $MachinePrecision], N[(N[(N[(Exp[x] - 1), $MachinePrecision] * c), $MachinePrecision] * y), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -1.2 \cdot 10^{-21} \lor \neg \left(y \leq 9.5 \cdot 10^{-78}\right):\\
\;\;\;\;\mathsf{log1p}\left(y \cdot \mathsf{expm1}\left(x\right)\right) \cdot c\\
\mathbf{else}:\\
\;\;\;\;\left(\mathsf{expm1}\left(x\right) \cdot c\right) \cdot y\\
\end{array}
\end{array}
if y < -1.2e-21 or 9.4999999999999997e-78 < y Initial program 38.1%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6438.1
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6445.4
lift-*.f64N/A
*-commutativeN/A
lower-*.f6445.4
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6499.6
Applied rewrites99.6%
if -1.2e-21 < y < 9.4999999999999997e-78Initial program 56.0%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6456.0
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6476.0
lift-*.f64N/A
*-commutativeN/A
lower-*.f6476.0
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6487.8
Applied rewrites87.8%
Taylor expanded in y around 0
*-commutativeN/A
*-lft-identityN/A
exp-prodN/A
e-exp-1N/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
e-exp-1N/A
exp-prodN/A
*-lft-identityN/A
lower-expm1.f6499.9
Applied rewrites99.9%
Final simplification99.8%
(FPCore (c x y) :precision binary64 (if (<= y -1.65) (* (log1p (pow (/ (fma (/ x y) -0.5 (pow y -1.0)) x) -1.0)) c) (if (<= y 1.65) (* (* (expm1 x) c) y) (* (log1p (* y x)) c))))
double code(double c, double x, double y) {
double tmp;
if (y <= -1.65) {
tmp = log1p(pow((fma((x / y), -0.5, pow(y, -1.0)) / x), -1.0)) * c;
} else if (y <= 1.65) {
tmp = (expm1(x) * c) * y;
} else {
tmp = log1p((y * x)) * c;
}
return tmp;
}
function code(c, x, y) tmp = 0.0 if (y <= -1.65) tmp = Float64(log1p((Float64(fma(Float64(x / y), -0.5, (y ^ -1.0)) / x) ^ -1.0)) * c); elseif (y <= 1.65) tmp = Float64(Float64(expm1(x) * c) * y); else tmp = Float64(log1p(Float64(y * x)) * c); end return tmp end
code[c_, x_, y_] := If[LessEqual[y, -1.65], N[(N[Log[1 + N[Power[N[(N[(N[(x / y), $MachinePrecision] * -0.5 + N[Power[y, -1.0], $MachinePrecision]), $MachinePrecision] / x), $MachinePrecision], -1.0], $MachinePrecision]], $MachinePrecision] * c), $MachinePrecision], If[LessEqual[y, 1.65], N[(N[(N[(Exp[x] - 1), $MachinePrecision] * c), $MachinePrecision] * y), $MachinePrecision], N[(N[Log[1 + N[(y * x), $MachinePrecision]], $MachinePrecision] * c), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -1.65:\\
\;\;\;\;\mathsf{log1p}\left({\left(\frac{\mathsf{fma}\left(\frac{x}{y}, -0.5, {y}^{-1}\right)}{x}\right)}^{-1}\right) \cdot c\\
\mathbf{elif}\;y \leq 1.65:\\
\;\;\;\;\left(\mathsf{expm1}\left(x\right) \cdot c\right) \cdot y\\
\mathbf{else}:\\
\;\;\;\;\mathsf{log1p}\left(y \cdot x\right) \cdot c\\
\end{array}
\end{array}
if y < -1.6499999999999999Initial program 49.2%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6449.2
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6449.2
lift-*.f64N/A
*-commutativeN/A
lower-*.f6449.2
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6499.5
Applied rewrites99.5%
*-lft-identityN/A
lift-*.f64N/A
remove-double-divN/A
unpow-1N/A
lift-pow.f64N/A
div-invN/A
frac-2negN/A
associate-*r/N/A
clear-numN/A
lower-/.f64N/A
lower-/.f64N/A
lift-pow.f64N/A
unpow-1N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f64N/A
lower-*.f64N/A
lower-neg.f6499.4
Applied rewrites99.4%
Taylor expanded in x around 0
lower-/.f64N/A
*-commutativeN/A
lower-fma.f64N/A
lower-/.f64N/A
lower-/.f6470.5
Applied rewrites70.5%
if -1.6499999999999999 < y < 1.6499999999999999Initial program 52.4%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6452.4
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6474.5
lift-*.f64N/A
*-commutativeN/A
lower-*.f6474.5
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6489.9
Applied rewrites89.9%
Taylor expanded in y around 0
*-commutativeN/A
*-lft-identityN/A
exp-prodN/A
e-exp-1N/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
e-exp-1N/A
exp-prodN/A
*-lft-identityN/A
lower-expm1.f6499.1
Applied rewrites99.1%
if 1.6499999999999999 < y Initial program 21.5%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6421.5
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6421.5
lift-*.f64N/A
*-commutativeN/A
lower-*.f6421.5
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6499.6
Applied rewrites99.6%
*-lft-identityN/A
lift-*.f64N/A
remove-double-divN/A
unpow-1N/A
lift-pow.f64N/A
div-invN/A
frac-2negN/A
associate-*r/N/A
clear-numN/A
lower-/.f64N/A
lower-/.f64N/A
lift-pow.f64N/A
unpow-1N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f64N/A
lower-*.f64N/A
lower-neg.f6499.6
Applied rewrites99.6%
Taylor expanded in x around 0
*-commutativeN/A
lower-*.f6499.6
Applied rewrites99.6%
Final simplification92.6%
(FPCore (c x y) :precision binary64 (if (<= y -0.88) (* (log1p (/ y (/ (fma -0.5 x 1.0) x))) c) (if (<= y 1.65) (* (* (expm1 x) c) y) (* (log1p (* y x)) c))))
double code(double c, double x, double y) {
double tmp;
if (y <= -0.88) {
tmp = log1p((y / (fma(-0.5, x, 1.0) / x))) * c;
} else if (y <= 1.65) {
tmp = (expm1(x) * c) * y;
} else {
tmp = log1p((y * x)) * c;
}
return tmp;
}
function code(c, x, y) tmp = 0.0 if (y <= -0.88) tmp = Float64(log1p(Float64(y / Float64(fma(-0.5, x, 1.0) / x))) * c); elseif (y <= 1.65) tmp = Float64(Float64(expm1(x) * c) * y); else tmp = Float64(log1p(Float64(y * x)) * c); end return tmp end
code[c_, x_, y_] := If[LessEqual[y, -0.88], N[(N[Log[1 + N[(y / N[(N[(-0.5 * x + 1.0), $MachinePrecision] / x), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * c), $MachinePrecision], If[LessEqual[y, 1.65], N[(N[(N[(Exp[x] - 1), $MachinePrecision] * c), $MachinePrecision] * y), $MachinePrecision], N[(N[Log[1 + N[(y * x), $MachinePrecision]], $MachinePrecision] * c), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -0.88:\\
\;\;\;\;\mathsf{log1p}\left(\frac{y}{\frac{\mathsf{fma}\left(-0.5, x, 1\right)}{x}}\right) \cdot c\\
\mathbf{elif}\;y \leq 1.65:\\
\;\;\;\;\left(\mathsf{expm1}\left(x\right) \cdot c\right) \cdot y\\
\mathbf{else}:\\
\;\;\;\;\mathsf{log1p}\left(y \cdot x\right) \cdot c\\
\end{array}
\end{array}
if y < -0.880000000000000004Initial program 49.2%
lift-*.f64N/A
*-commutativeN/A
lift--.f64N/A
flip--N/A
clear-numN/A
un-div-invN/A
lower-/.f64N/A
clear-numN/A
flip--N/A
lift--.f64N/A
inv-powN/A
metadata-evalN/A
lower-pow.f64N/A
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f64N/A
metadata-eval66.8
Applied rewrites66.8%
Taylor expanded in x around 0
lower-/.f64N/A
+-commutativeN/A
lower-fma.f6437.8
Applied rewrites37.8%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6437.8
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6470.4
Applied rewrites70.4%
if -0.880000000000000004 < y < 1.6499999999999999Initial program 52.4%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6452.4
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6474.5
lift-*.f64N/A
*-commutativeN/A
lower-*.f6474.5
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6489.9
Applied rewrites89.9%
Taylor expanded in y around 0
*-commutativeN/A
*-lft-identityN/A
exp-prodN/A
e-exp-1N/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
e-exp-1N/A
exp-prodN/A
*-lft-identityN/A
lower-expm1.f6499.1
Applied rewrites99.1%
if 1.6499999999999999 < y Initial program 21.5%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6421.5
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6421.5
lift-*.f64N/A
*-commutativeN/A
lower-*.f6421.5
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6499.6
Applied rewrites99.6%
*-lft-identityN/A
lift-*.f64N/A
remove-double-divN/A
unpow-1N/A
lift-pow.f64N/A
div-invN/A
frac-2negN/A
associate-*r/N/A
clear-numN/A
lower-/.f64N/A
lower-/.f64N/A
lift-pow.f64N/A
unpow-1N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f64N/A
lower-*.f64N/A
lower-neg.f6499.6
Applied rewrites99.6%
Taylor expanded in x around 0
*-commutativeN/A
lower-*.f6499.6
Applied rewrites99.6%
(FPCore (c x y) :precision binary64 (if (or (<= y -1700000.0) (not (<= y 1.65))) (* (log1p (* y x)) c) (* (* (expm1 x) c) y)))
double code(double c, double x, double y) {
double tmp;
if ((y <= -1700000.0) || !(y <= 1.65)) {
tmp = log1p((y * x)) * c;
} else {
tmp = (expm1(x) * c) * y;
}
return tmp;
}
public static double code(double c, double x, double y) {
double tmp;
if ((y <= -1700000.0) || !(y <= 1.65)) {
tmp = Math.log1p((y * x)) * c;
} else {
tmp = (Math.expm1(x) * c) * y;
}
return tmp;
}
def code(c, x, y): tmp = 0 if (y <= -1700000.0) or not (y <= 1.65): tmp = math.log1p((y * x)) * c else: tmp = (math.expm1(x) * c) * y return tmp
function code(c, x, y) tmp = 0.0 if ((y <= -1700000.0) || !(y <= 1.65)) tmp = Float64(log1p(Float64(y * x)) * c); else tmp = Float64(Float64(expm1(x) * c) * y); end return tmp end
code[c_, x_, y_] := If[Or[LessEqual[y, -1700000.0], N[Not[LessEqual[y, 1.65]], $MachinePrecision]], N[(N[Log[1 + N[(y * x), $MachinePrecision]], $MachinePrecision] * c), $MachinePrecision], N[(N[(N[(Exp[x] - 1), $MachinePrecision] * c), $MachinePrecision] * y), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -1700000 \lor \neg \left(y \leq 1.65\right):\\
\;\;\;\;\mathsf{log1p}\left(y \cdot x\right) \cdot c\\
\mathbf{else}:\\
\;\;\;\;\left(\mathsf{expm1}\left(x\right) \cdot c\right) \cdot y\\
\end{array}
\end{array}
if y < -1.7e6 or 1.6499999999999999 < y Initial program 38.7%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6438.7
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6438.7
lift-*.f64N/A
*-commutativeN/A
lower-*.f6438.7
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6499.5
Applied rewrites99.5%
*-lft-identityN/A
lift-*.f64N/A
remove-double-divN/A
unpow-1N/A
lift-pow.f64N/A
div-invN/A
frac-2negN/A
associate-*r/N/A
clear-numN/A
lower-/.f64N/A
lower-/.f64N/A
lift-pow.f64N/A
unpow-1N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f64N/A
lower-*.f64N/A
lower-neg.f6499.5
Applied rewrites99.5%
Taylor expanded in x around 0
*-commutativeN/A
lower-*.f6475.8
Applied rewrites75.8%
if -1.7e6 < y < 1.6499999999999999Initial program 52.4%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6452.4
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6474.2
lift-*.f64N/A
*-commutativeN/A
lower-*.f6474.2
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6490.0
Applied rewrites90.0%
Taylor expanded in y around 0
*-commutativeN/A
*-lft-identityN/A
exp-prodN/A
e-exp-1N/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
e-exp-1N/A
exp-prodN/A
*-lft-identityN/A
lower-expm1.f6498.6
Applied rewrites98.6%
Final simplification90.5%
(FPCore (c x y) :precision binary64 (* (* (expm1 x) c) y))
double code(double c, double x, double y) {
return (expm1(x) * c) * y;
}
public static double code(double c, double x, double y) {
return (Math.expm1(x) * c) * y;
}
def code(c, x, y): return (math.expm1(x) * c) * y
function code(c, x, y) return Float64(Float64(expm1(x) * c) * y) end
code[c_, x_, y_] := N[(N[(N[(Exp[x] - 1), $MachinePrecision] * c), $MachinePrecision] * y), $MachinePrecision]
\begin{array}{l}
\\
\left(\mathsf{expm1}\left(x\right) \cdot c\right) \cdot y
\end{array}
Initial program 47.5%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6447.5
lift-log.f64N/A
lift-+.f64N/A
lower-log1p.f6461.4
lift-*.f64N/A
*-commutativeN/A
lower-*.f6461.4
lift--.f64N/A
lift-pow.f64N/A
lift-E.f64N/A
e-exp-1N/A
pow-expN/A
*-lft-identityN/A
lower-expm1.f6493.4
Applied rewrites93.4%
Taylor expanded in y around 0
*-commutativeN/A
*-lft-identityN/A
exp-prodN/A
e-exp-1N/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
e-exp-1N/A
exp-prodN/A
*-lft-identityN/A
lower-expm1.f6479.2
Applied rewrites79.2%
(FPCore (c x y) :precision binary64 (if (<= c 1e-23) (* (* c y) x) (* (* x c) y)))
double code(double c, double x, double y) {
double tmp;
if (c <= 1e-23) {
tmp = (c * y) * x;
} else {
tmp = (x * c) * y;
}
return tmp;
}
real(8) function code(c, x, y)
real(8), intent (in) :: c
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8) :: tmp
if (c <= 1d-23) then
tmp = (c * y) * x
else
tmp = (x * c) * y
end if
code = tmp
end function
public static double code(double c, double x, double y) {
double tmp;
if (c <= 1e-23) {
tmp = (c * y) * x;
} else {
tmp = (x * c) * y;
}
return tmp;
}
def code(c, x, y): tmp = 0 if c <= 1e-23: tmp = (c * y) * x else: tmp = (x * c) * y return tmp
function code(c, x, y) tmp = 0.0 if (c <= 1e-23) tmp = Float64(Float64(c * y) * x); else tmp = Float64(Float64(x * c) * y); end return tmp end
function tmp_2 = code(c, x, y) tmp = 0.0; if (c <= 1e-23) tmp = (c * y) * x; else tmp = (x * c) * y; end tmp_2 = tmp; end
code[c_, x_, y_] := If[LessEqual[c, 1e-23], N[(N[(c * y), $MachinePrecision] * x), $MachinePrecision], N[(N[(x * c), $MachinePrecision] * y), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;c \leq 10^{-23}:\\
\;\;\;\;\left(c \cdot y\right) \cdot x\\
\mathbf{else}:\\
\;\;\;\;\left(x \cdot c\right) \cdot y\\
\end{array}
\end{array}
if c < 9.9999999999999996e-24Initial program 54.5%
Taylor expanded in x around 0
associate-*r*N/A
log-EN/A
*-commutativeN/A
*-lft-identityN/A
*-commutativeN/A
associate-*l*N/A
*-commutativeN/A
*-rgt-identityN/A
metadata-evalN/A
log-EN/A
log-EN/A
metadata-evalN/A
log-EN/A
lower-*.f64N/A
log-EN/A
*-rgt-identityN/A
lower-*.f6466.5
Applied rewrites66.5%
if 9.9999999999999996e-24 < c Initial program 26.9%
Taylor expanded in x around 0
associate-*r*N/A
log-EN/A
*-commutativeN/A
*-lft-identityN/A
*-commutativeN/A
associate-*l*N/A
*-commutativeN/A
*-rgt-identityN/A
metadata-evalN/A
log-EN/A
log-EN/A
metadata-evalN/A
log-EN/A
lower-*.f64N/A
log-EN/A
*-rgt-identityN/A
lower-*.f6458.1
Applied rewrites58.1%
Applied rewrites61.0%
(FPCore (c x y) :precision binary64 (* (* c y) x))
double code(double c, double x, double y) {
return (c * y) * x;
}
real(8) function code(c, x, y)
real(8), intent (in) :: c
real(8), intent (in) :: x
real(8), intent (in) :: y
code = (c * y) * x
end function
public static double code(double c, double x, double y) {
return (c * y) * x;
}
def code(c, x, y): return (c * y) * x
function code(c, x, y) return Float64(Float64(c * y) * x) end
function tmp = code(c, x, y) tmp = (c * y) * x; end
code[c_, x_, y_] := N[(N[(c * y), $MachinePrecision] * x), $MachinePrecision]
\begin{array}{l}
\\
\left(c \cdot y\right) \cdot x
\end{array}
Initial program 47.5%
Taylor expanded in x around 0
associate-*r*N/A
log-EN/A
*-commutativeN/A
*-lft-identityN/A
*-commutativeN/A
associate-*l*N/A
*-commutativeN/A
*-rgt-identityN/A
metadata-evalN/A
log-EN/A
log-EN/A
metadata-evalN/A
log-EN/A
lower-*.f64N/A
log-EN/A
*-rgt-identityN/A
lower-*.f6464.4
Applied rewrites64.4%
(FPCore (c x y) :precision binary64 (* c (log1p (* (expm1 x) y))))
double code(double c, double x, double y) {
return c * log1p((expm1(x) * y));
}
public static double code(double c, double x, double y) {
return c * Math.log1p((Math.expm1(x) * y));
}
def code(c, x, y): return c * math.log1p((math.expm1(x) * y))
function code(c, x, y) return Float64(c * log1p(Float64(expm1(x) * y))) end
code[c_, x_, y_] := N[(c * N[Log[1 + N[(N[(Exp[x] - 1), $MachinePrecision] * y), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
c \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(x\right) \cdot y\right)
\end{array}
herbie shell --seed 2024318
(FPCore (c x y)
:name "Logarithmic Transform"
:precision binary64
:alt
(* c (log1p (* (expm1 x) y)))
(* c (log (+ 1.0 (* (- (pow (E) x) 1.0) y)))))