reuse expm1 result for differential
We can reuse the expm1 result to compute the differential and eliminate
the extra exp call.
Change-Id: Ibd4f0564ab6da99fc23fbf6462408cfc3408fda1
diff --git a/include/ceres/jet.h b/include/ceres/jet.h
index 4f3b144..62e9828 100644
--- a/include/ceres/jet.h
+++ b/include/ceres/jet.h
@@ -490,7 +490,9 @@
// expm1(a + h) ~= expm1(a) + exp(a) h
template <typename T, int N>
inline Jet<T, N> expm1(const Jet<T, N>& f) {
- return Jet<T, N>(expm1(f.a), exp(f.a) * f.v);
+ const T tmp = expm1(f.a);
+ const T expa = tmp + T(1.0); // exp(a) = expm1(a) + 1
+ return Jet<T, N>(tmp, expa * f.v);
}
// sqrt(a + h) ~= sqrt(a) + h / (2 sqrt(a))