Workaround MSVC STL deficiency in C++17 mode
Compiling jet_test using the /std:c++17 switch triggers a C3198 compile
error in <numeric>. Moving #pragma below all the includes, allows to
workaround the issue.
Additionally, locally ensure the floating-point model is always
/fp:precise to be able to access the floating-point environment in
jet_test.
Change-Id: Ia5b3a3dac13baf46546ac1d0d304fc05512f8816
diff --git a/internal/ceres/jet_test.cc b/internal/ceres/jet_test.cc
index 44db7aa..6f71b77 100644
--- a/internal/ceres/jet_test.cc
+++ b/internal/ceres/jet_test.cc
@@ -28,17 +28,6 @@
//
// Author: keir@google.com (Keir Mierle)
-// The floating-point environment access and modification is only meaningful
-// with the following pragma.
-#ifdef _MSC_VER
-#pragma fenv_access(on)
-#elif !(defined(__ARM_ARCH) && __ARM_ARCH >= 8)
-// NOTE: FENV_ACCESS cannot be set to ON when targeting arm(v8)
-#pragma STDC FENV_ACCESS ON
-#else
-#define CERES_NO_FENV_ACCESS
-#endif
-
#include "ceres/jet.h"
#include <Eigen/Dense>
@@ -52,6 +41,18 @@
#include "gmock/gmock.h"
#include "gtest/gtest.h"
+// The floating-point environment access and modification is only meaningful
+// with the following pragma.
+#ifdef _MSC_VER
+#pragma float_control(precise, on, push)
+#pragma fenv_access(on)
+#elif !(defined(__ARM_ARCH) && __ARM_ARCH >= 8)
+// NOTE: FENV_ACCESS cannot be set to ON when targeting arm(v8)
+#pragma STDC FENV_ACCESS ON
+#else
+#define CERES_NO_FENV_ACCESS
+#endif
+
namespace ceres {
namespace internal {
@@ -1293,3 +1294,7 @@
} // namespace internal
} // namespace ceres
+
+#ifdef _MSC_VER
+#pragma float_control(pop)
+#endif