Drop use of POSIX M_PI Change-Id: I37342a366161bb13d6456ecc67569fe12705e05c
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f17d88..8e49c19 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -516,12 +516,6 @@ # After the tweaks for the compile settings, disable some warnings on MSVC. if (MSVC) - # On MSVC, math constants are not included in <cmath> or <math.h> unless - # _USE_MATH_DEFINES is defined [1]. As we use M_PI in the examples, ensure - # that _USE_MATH_DEFINES is defined before the first inclusion of <cmath>. - # - # [1] https://msdn.microsoft.com/en-us/library/4hwaceh6.aspx - add_compile_definitions(_USE_MATH_DEFINES) # Insecure standard library functions add_compile_definitions(_CRT_SECURE_NO_WARNINGS) # std::numeric_limits<T>::has_denorm is deprecated in C++23
diff --git a/examples/ellipse_approximation.cc b/examples/ellipse_approximation.cc index 5f31b12..eefc72d 100644 --- a/examples/ellipse_approximation.cc +++ b/examples/ellipse_approximation.cc
@@ -396,7 +396,7 @@ // // Initialize `X` to points on the unit circle. VectorXd w(num_segments + 1); - w.setLinSpaced(num_segments + 1, 0.0, 2.0 * M_PI); + w.setLinSpaced(num_segments + 1, 0.0, 2.0 * ceres::constants::pi); w.conservativeResize(num_segments); MatrixXd X(num_segments, 2); X.col(0) = w.array().cos();
diff --git a/examples/more_garbow_hillstrom.cc b/examples/more_garbow_hillstrom.cc index 35936f4..b2fe61b 100644 --- a/examples/more_garbow_hillstrom.cc +++ b/examples/more_garbow_hillstrom.cc
@@ -223,7 +223,7 @@ const T x1 = x[0]; const T x2 = x[1]; const T x3 = x[2]; - const T theta = (0.5 / M_PI) * atan(x2 / x1) + (x1 > 0.0 ? 0.0 : 0.5); + const T theta = (0.5 / constants::pi) * atan(x2 / x1) + (x1 > 0.0 ? 0.0 : 0.5); residual[0] = 10.0 * (x3 - 10.0 * theta); residual[1] = 10.0 * (sqrt(x1 * x1 + x2 * x2) - 1.0); residual[2] = x3;
diff --git a/examples/slam/pose_graph_2d/normalize_angle.h b/examples/slam/pose_graph_2d/normalize_angle.h index d54547a..0602878 100644 --- a/examples/slam/pose_graph_2d/normalize_angle.h +++ b/examples/slam/pose_graph_2d/normalize_angle.h
@@ -41,9 +41,9 @@ template <typename T> inline T NormalizeAngle(const T& angle_radians) { // Use ceres::floor because it is specialized for double and Jet types. - T two_pi(2.0 * M_PI); + T two_pi(2.0 * constants::pi); return angle_radians - - two_pi * ceres::floor((angle_radians + T(M_PI)) / two_pi); + two_pi * ceres::floor((angle_radians + T(constants::pi)) / two_pi); } } // namespace ceres::examples
diff --git a/include/ceres/ceres.h b/include/ceres/ceres.h index 5beec9c..51f9d89 100644 --- a/include/ceres/ceres.h +++ b/include/ceres/ceres.h
@@ -39,8 +39,8 @@ #include "ceres/autodiff_first_order_function.h" #include "ceres/autodiff_manifold.h" #include "ceres/conditioned_cost_function.h" -#include "ceres/context.h" #include "ceres/constants.h" +#include "ceres/context.h" #include "ceres/cost_function.h" #include "ceres/cost_function_to_functor.h" #include "ceres/covariance.h"
diff --git a/include/ceres/constants.h b/include/ceres/constants.h index 8558160..584b669 100644 --- a/include/ceres/constants.h +++ b/include/ceres/constants.h
@@ -36,6 +36,7 @@ namespace ceres::constants { template <typename T> inline constexpr T pi_v(3.141592653589793238462643383279502884); +inline constexpr double pi = pi_v<double>; } // namespace ceres::constants #endif // CERES_PUBLIC_CONSTANTS_H_
diff --git a/include/ceres/internal/sphere_manifold_functions.h b/include/ceres/internal/sphere_manifold_functions.h index 184edf9..4793442 100644 --- a/include/ceres/internal/sphere_manifold_functions.h +++ b/include/ceres/internal/sphere_manifold_functions.h
@@ -32,6 +32,7 @@ #ifndef CERES_PUBLIC_INTERNAL_SPHERE_MANIFOLD_HELPERS_H_ #define CERES_PUBLIC_INTERNAL_SPHERE_MANIFOLD_HELPERS_H_ +#include "ceres/constants.h" #include "ceres/internal/householder_vector.h" // This module contains functions to compute the SphereManifold plus and minus @@ -122,7 +123,7 @@ const double hy_norm = hy.template head<TangentSpaceDim>(tangent_size).norm(); if (hy_norm == 0.0) { y_minus_x->setZero(); - y_minus_x->data()[tangent_size - 1] = y_last >= 0 ? 0.0 : M_PI; + y_minus_x->data()[tangent_size - 1] = y_last >= 0 ? 0.0 : constants::pi; } else { *y_minus_x = std::atan2(hy_norm, y_last) / hy_norm * hy.template head<TangentSpaceDim>(tangent_size);
diff --git a/include/ceres/rotation.h b/include/ceres/rotation.h index 7d2d79e..0cccfa7 100644 --- a/include/ceres/rotation.h +++ b/include/ceres/rotation.h
@@ -610,7 +610,7 @@ // [-pi, pi) x [0, pi / 2) x [-pi, pi) // which is enforced here if constexpr (EulerSystem::kIsProperEuler) { - const T kPi(constants::pi_v<double>); + const T kPi(constants::pi); const T kTwoPi(2.0 * kPi); if (euler[1] < T(0.0) || ea[1] > kPi) { euler[0] += kPi;
diff --git a/internal/ceres/autodiff_benchmarks/brdf_cost_function.h b/internal/ceres/autodiff_benchmarks/brdf_cost_function.h index 87842c0..41cfcfa 100644 --- a/internal/ceres/autodiff_benchmarks/brdf_cost_function.h +++ b/internal/ceres/autodiff_benchmarks/brdf_cost_function.h
@@ -35,6 +35,8 @@ #include <Eigen/Core> #include <cmath> +#include "ceres/constants.h" + namespace ceres { // The brdf is based on: @@ -139,7 +141,7 @@ const T gr = cggxn_dot_l * cggxn_dot_v; const Vec3 result_no_cosine = - (T(1.0 / M_PI) * Lerp(fd, ss, subsurface) * c + f_sheen) * + (T(1.0 / constants::pi) * Lerp(fd, ss, subsurface) * c + f_sheen) * (T(1) - metallic) + gs * fs * ds + Vec3(T(0.25), T(0.25), T(0.25)) * clearcoat * gr * fr * dr; @@ -177,11 +179,11 @@ T result = T(0); if (a >= T(1)) { - result = T(1 / M_PI); + result = T(1 / constants::pi); } else { const T a2 = a * a; const T t = T(1) + (a2 - T(1)) * n_dot_h * n_dot_h; - result = (a2 - T(1)) / (T(M_PI) * T(log(a2) * t)); + result = (a2 - T(1)) / (T(constants::pi) * T(log(a2) * t)); } return result; } @@ -192,7 +194,7 @@ const T& h_dot_y, const T& ax, const T& ay) const { - return T(1) / (T(M_PI) * ax * ay * + return T(1) / (T(constants::pi) * ax * ay * Square(Square(h_dot_x / ax) + Square(h_dot_y / ay) + n_dot_h * n_dot_h)); }
diff --git a/internal/ceres/autodiff_manifold_test.cc b/internal/ceres/autodiff_manifold_test.cc index 6e5c4fc..c687719 100644 --- a/internal/ceres/autodiff_manifold_test.cc +++ b/internal/ceres/autodiff_manifold_test.cc
@@ -32,6 +32,7 @@ #include <cmath> +#include "ceres/constants.h" #include "ceres/manifold.h" #include "ceres/manifold_test_utils.h" #include "ceres/rotation.h" @@ -197,7 +198,7 @@ for (int i = 0; i < 3; ++i) { Vector delta = Vector::Zero(3); - delta[i] = M_PI / 2; + delta[i] = constants::pi / 2; Vector x_plus_delta = Vector::Zero(4); EXPECT_TRUE(manifold.Plus(x.data(), delta.data(), x_plus_delta.data())); @@ -285,7 +286,7 @@ const Vector y = RandomQuaternion(); Vector delta = Vector::Random(3); delta.normalize(); - delta *= (M_PI - 1e-6); + delta *= (constants::pi - 1e-6); EXPECT_THAT(manifold, QuaternionPlusIsCorrectAt(x, delta)); EXPECT_THAT_MANIFOLD_INVARIANTS_HOLD(manifold, x, delta, y, kTolerance); }
diff --git a/internal/ceres/dynamic_sparsity_test.cc b/internal/ceres/dynamic_sparsity_test.cc index c1b971d..0c29595 100644 --- a/internal/ceres/dynamic_sparsity_test.cc +++ b/internal/ceres/dynamic_sparsity_test.cc
@@ -383,7 +383,7 @@ // // Initialize `X` to points on the unit circle. Vector w(num_segments + 1); - w.setLinSpaced(num_segments + 1, 0.0, 2.0 * M_PI); + w.setLinSpaced(num_segments + 1, 0.0, 2.0 * constants::pi); w.conservativeResize(num_segments); Matrix X(num_segments, 2); X.col(0) = w.array().cos();
diff --git a/internal/ceres/manifold_test.cc b/internal/ceres/manifold_test.cc index dc0fe53..33f9386 100644 --- a/internal/ceres/manifold_test.cc +++ b/internal/ceres/manifold_test.cc
@@ -36,6 +36,7 @@ #include <utility> #include "Eigen/Geometry" +#include "ceres/constants.h" #include "ceres/dynamic_numeric_diff_cost_function.h" #include "ceres/internal/eigen.h" #include "ceres/internal/port.h" @@ -504,7 +505,7 @@ for (int i = 0; i < 3; ++i) { Vector delta = Vector::Zero(3); - delta[i] = M_PI / 2; + delta[i] = constants::pi / 2; Vector x_plus_delta = Vector::Zero(4); EXPECT_TRUE(manifold.Plus(x.data(), delta.data(), x_plus_delta.data())); @@ -598,7 +599,7 @@ const Vector y = RandomQuaternion(); Vector delta = Vector::Random(3); delta.normalize(); - delta *= (M_PI - 1e-6); + delta *= (constants::pi - 1e-6); EXPECT_THAT(manifold, QuaternionManifoldPlusIsCorrectAt(x, delta)); EXPECT_THAT_MANIFOLD_INVARIANTS_HOLD(manifold, x, delta, y, kTolerance); } @@ -669,7 +670,7 @@ const Vector y = RandomQuaternion(); Vector delta = Vector::Random(3); delta.normalize(); - delta *= (M_PI - 1e-6); + delta *= (constants::pi - 1e-6); EXPECT_THAT(manifold, EigenQuaternionManifoldPlusIsCorrectAt(x, delta)); EXPECT_THAT_MANIFOLD_INVARIANTS_HOLD(manifold, x, delta, y, kTolerance); } @@ -732,7 +733,7 @@ } { - double delta[1]{M_PI}; + double delta[1]{constants::pi}; Eigen::Vector2d y = Eigen::Vector2d::Zero(); EXPECT_TRUE(manifold.Plus(x.data(), delta, y.data())); const Eigen::Vector2d gtY = -Eigen::Vector2d::UnitY(); @@ -740,7 +741,7 @@ } { - double delta[1]{2.0 * M_PI}; + double delta[1]{2.0 * constants::pi}; Eigen::Vector2d y = Eigen::Vector2d::Zero(); EXPECT_TRUE(manifold.Plus(x.data(), delta, y.data())); const Eigen::Vector2d gtY = Eigen::Vector2d::UnitY(); @@ -761,7 +762,7 @@ } { - Eigen::Vector2d delta{M_PI, 0.0}; + Eigen::Vector2d delta{constants::pi, 0.0}; Eigen::Vector3d y = Eigen::Vector3d::Zero(); EXPECT_TRUE(manifold.Plus(x.data(), delta.data(), y.data())); const Eigen::Vector3d gtY = -Eigen::Vector3d::UnitZ(); @@ -769,7 +770,7 @@ } { - Eigen::Vector2d delta{2.0 * M_PI, 0.0}; + Eigen::Vector2d delta{2.0 * constants::pi, 0.0}; Eigen::Vector3d y = Eigen::Vector3d::Zero(); EXPECT_TRUE(manifold.Plus(x.data(), delta.data(), y.data())); const Eigen::Vector3d gtY = Eigen::Vector3d::UnitZ(); @@ -785,7 +786,7 @@ } { - Eigen::Vector2d delta{0.0, M_PI}; + Eigen::Vector2d delta{0.0, constants::pi}; Eigen::Vector3d y = Eigen::Vector3d::Zero(); EXPECT_TRUE(manifold.Plus(x.data(), delta.data(), y.data())); const Eigen::Vector3d gtY = -Eigen::Vector3d::UnitZ(); @@ -793,7 +794,7 @@ } { - Eigen::Vector2d delta{0.0, 2.0 * M_PI}; + Eigen::Vector2d delta{0.0, 2.0 * constants::pi}; Eigen::Vector3d y = Eigen::Vector3d::Zero(); EXPECT_TRUE(manifold.Plus(x.data(), delta.data(), y.data())); const Eigen::Vector3d gtY = Eigen::Vector3d::UnitZ(); @@ -809,7 +810,7 @@ } { - Eigen::Vector2d delta = Eigen::Vector2d(1, 1).normalized() * M_PI; + Eigen::Vector2d delta = Eigen::Vector2d(1, 1).normalized() * constants::pi; Eigen::Vector3d y = Eigen::Vector3d::Zero(); EXPECT_TRUE(manifold.Plus(x.data(), delta.data(), y.data())); const Eigen::Vector3d gtY = -Eigen::Vector3d::UnitZ(); @@ -832,7 +833,7 @@ { double delta[1]; const Eigen::Vector2d y(-1, 0); - const double gtDelta{M_PI}; + const double gtDelta{constants::pi}; EXPECT_TRUE(manifold.Minus(y.data(), x.data(), delta)); EXPECT_LT(std::abs(delta[0] - gtDelta), kTolerance); } @@ -853,7 +854,7 @@ { Eigen::Vector2d delta; const Eigen::Vector3d y(-1, 0, 0); - const Eigen::Vector2d gtDelta(0.0, M_PI); + const Eigen::Vector2d gtDelta(0.0, constants::pi); EXPECT_TRUE(manifold.Minus(y.data(), x.data(), delta.data())); EXPECT_LT((delta - gtDelta).norm(), kTolerance); }
diff --git a/internal/ceres/rotation_test.cc b/internal/ceres/rotation_test.cc index 87f9de7..f1ea071 100644 --- a/internal/ceres/rotation_test.cc +++ b/internal/ceres/rotation_test.cc
@@ -53,7 +53,7 @@ namespace ceres { namespace internal { -inline constexpr double kPi = constants::pi_v<double>; +inline constexpr double kPi = constants::pi; const double kHalfSqrt2 = 0.707106781186547524401; // A tolerance value for floating-point comparisons.