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