From 552a4e5170cbef752a3cfc4a101c298399adbf38 Mon Sep 17 00:00:00 2001 From: Sergiu Deitsch Date: Thu, 18 Nov 2021 23:11:31 +0100 Subject: [PATCH] support log10 jet Change-Id: I1425f7c8fc891cf941a162b8e5b427b5ab4e71da --- include/ceres/jet.h | 9 +++++++++ internal/ceres/jet_test.cc | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/ceres/jet.h b/include/ceres/jet.h index 62e982815..e45caf2a2 100644 --- a/include/ceres/jet.h +++ b/include/ceres/jet.h @@ -404,6 +404,7 @@ using std::isinf; using std::isnan; using std::isnormal; using std::log; +using std::log10; using std::log1p; using std::log2; using std::norm; @@ -473,6 +474,14 @@ inline Jet log(const Jet& f) { return Jet(log(f.a), f.v * a_inverse); } +// log10(a + h) ~= log10(a) + h / (a log(10)) +template +inline Jet log10(const Jet& f) { + // Most compilers will expand log(10) to a constant. + const T a_inverse = T(1.0) / (f.a * log(T(10.0))); + return Jet(log10(f.a), f.v * a_inverse); +} + // log1p(a + h) ~= log1p(a) + h / (1 + a) template inline Jet log1p(const Jet& f) { diff --git a/internal/ceres/jet_test.cc b/internal/ceres/jet_test.cc index 6a7011d98..bceb9e480 100644 --- a/internal/ceres/jet_test.cc +++ b/internal/ceres/jet_test.cc @@ -702,6 +702,17 @@ TEST(Jet, Jet) { NumericalTest("exp2", exp2, 1e-5); NumericalTest("exp2", exp2, 1.0); + { // Check that log10(x) == log(x) / log(10) + J z = log10(x); + J w = log(x) / log(10.0); + VL << "z = " << z; + VL << "w = " << w; + ExpectJetsClose(z, w); + } + NumericalTest("log10", log10, 1e-5); + NumericalTest("log10", log10, 1.0); + NumericalTest("log10", log10, 98.76); + { // Check that log2(x) == log(x) / log(2) J z = log2(x); J w = log(x) / log(2.0);