Change DurationFromDouble to return -InfiniteDuration() for all NaNs. If NaN is produced in the arithmetic operation than the sign bit is implementation-defined and mostly irrelevant. In particular Arm and x86 produce different results. There is no good reason to produce different results based on the sign of NaN. PiperOrigin-RevId: 773329134 Change-Id: I8df42e90a677402550ad76f0d3dde8521e4b7725
diff --git a/absl/time/time.h b/absl/time/time.h index 53bca90..29beaac 100644 --- a/absl/time/time.h +++ b/absl/time/time.h
@@ -589,9 +589,10 @@ } return time_internal::MakePosDoubleDuration(n); } else { - if (std::isnan(n)) - return std::signbit(n) ? -InfiniteDuration() : InfiniteDuration(); - if (n <= (std::numeric_limits<int64_t>::min)()) return -InfiniteDuration(); + if (std::isnan(n)) return -InfiniteDuration(); + if (n <= static_cast<T>((std::numeric_limits<int64_t>::min)())) { + return -InfiniteDuration(); + } return -time_internal::MakePosDoubleDuration(-n); } }