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) {