--- src/s2/s2edge_crossings.cc.orig 2023-04-28 23:28:39.000000000 +0800 +++ src/s2/s2edge_crossings.cc 2023-05-18 18:05:32.000000000 +0800 @@ -116,7 +116,7 @@ // "a" and "b" are closer than about 18 * DBL_ERR == 9 * DBL_EPSILON. // (80-bit precision can handle inputs as close as 2.5 * LDBL_EPSILON.) constexpr T T_ERR = rounding_epsilon(); - constexpr T kMinNorm = + const T kMinNorm = (32 * kSqrt3 * DBL_ERR) / (kRobustCrossProdError.radians() / T_ERR - (1 + 2 * kSqrt3)); @@ -459,7 +459,7 @@ constexpr T T_ERR = rounding_epsilon(); constexpr T kMinNormalLength = (16 * kSqrt3 + 24) * DBL_ERR; - constexpr T kMinResultLen = + const T kMinResultLen = 12 / (kIntersectionError.radians() / T_ERR - (2 + 2 * kSqrt3)); // On some platforms "long double" is the same as "double", and on these --- src/s2/s2predicates.cc.orig 2023-04-28 23:28:39.000000000 +0800 +++ src/s2/s2predicates.cc 2023-05-19 01:05:41.000000000 +0800 @@ -932,7 +932,7 @@ // Reference: // Error Estimation Of Floating-Point Summation And Dot Product, Rump // 2011 - constexpr T kMaxError = 3.046875 * std::numeric_limits::epsilon(); + const T kMaxError = 3.046875 * std::numeric_limits::epsilon(); T na = a.DotProd(b); if (std::fabs(na) <= kMaxError) return 0;