reworked copysign tests Zero sign propagation is not always guaranteed. Replace signbit checks by checks for -nan and +nan sign. Change-Id: If2ba367e4116d4e6a008a83cf2bc6a8851b27af7
diff --git a/internal/ceres/jet_test.cc b/internal/ceres/jet_test.cc index 32b1361..b7b6004 100644 --- a/internal/ceres/jet_test.cc +++ b/internal/ceres/jet_test.cc
@@ -951,8 +951,6 @@ J z = copysign(MakeJet(+0, 1, 2), J{+0}); VL << "z = " << z; EXPECT_FALSE(std::signbit(z.a)); - EXPECT_TRUE(std::signbit(z.v[0])); - EXPECT_TRUE(std::signbit(z.v[1])); EXPECT_TRUE(IsNaN(z.v[0])); EXPECT_TRUE(IsNaN(z.v[1])); } @@ -960,8 +958,6 @@ J z = copysign(MakeJet(+0, 1, 2), J{-0}); VL << "z = " << z; EXPECT_FALSE(std::signbit(z.a)); - EXPECT_TRUE(std::signbit(z.v[0])); - EXPECT_TRUE(std::signbit(z.v[1])); EXPECT_TRUE(IsNaN(z.v[0])); EXPECT_TRUE(IsNaN(z.v[1])); } @@ -969,8 +965,6 @@ J z = copysign(MakeJet(-0, 1, 2), J{+0}); VL << "z = " << z; EXPECT_FALSE(std::signbit(z.a)); - EXPECT_TRUE(std::signbit(z.v[0])); - EXPECT_TRUE(std::signbit(z.v[1])); EXPECT_TRUE(IsNaN(z.v[0])); EXPECT_TRUE(IsNaN(z.v[1])); } @@ -978,11 +972,29 @@ J z = copysign(MakeJet(-0, 1, 2), J{-0}); VL << "z = " << z; EXPECT_FALSE(std::signbit(z.a)); - EXPECT_TRUE(std::signbit(z.v[0])); - EXPECT_TRUE(std::signbit(z.v[1])); EXPECT_TRUE(IsNaN(z.v[0])); EXPECT_TRUE(IsNaN(z.v[1])); } + { // copysign(1, -nan) + J z = copysign(MakeJet(1, 2, 3), + -J{std::numeric_limits<double>::quiet_NaN()}); + VL << "z = " << z; + EXPECT_TRUE(std::signbit(z.a)); + EXPECT_TRUE(std::signbit(z.v[0])); + EXPECT_TRUE(std::signbit(z.v[1])); + EXPECT_FALSE(IsNaN(z.v[0])); + EXPECT_FALSE(IsNaN(z.v[1])); + } + { // copysign(1, +nan) + J z = copysign(MakeJet(1, 2, 3), + +J{std::numeric_limits<double>::quiet_NaN()}); + VL << "z = " << z; + EXPECT_FALSE(std::signbit(z.a)); + EXPECT_FALSE(std::signbit(z.v[0])); + EXPECT_FALSE(std::signbit(z.v[1])); + EXPECT_FALSE(IsNaN(z.v[0])); + EXPECT_FALSE(IsNaN(z.v[1])); + } } TEST(Jet, JetsInEigenMatrices) {