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.