Index: src/conversions.h |
diff --git a/src/conversions.h b/src/conversions.h |
index 70559c9e9d7979f449110793bbdde122cd1d99a5..d62a172757daa09880b7e19f753b52e5ac3ed305 100644 |
--- a/src/conversions.h |
+++ b/src/conversions.h |
@@ -59,14 +59,23 @@ inline double SignedZero(bool negative) { |
// The fast double-to-(unsigned-)int conversion routine does not guarantee |
// rounding towards zero. |
+// For NaN and values outside the int range, return INT_MIN or INT_MAX. |
+inline int FastD2IChecked(double x) { |
+ if (!(x >= INT_MIN)) return INT_MIN; // Negation to catch NaNs. |
+ if (x > INT_MAX) return INT_MAX; |
+ return static_cast<int>(x); |
+} |
+ |
+ |
+// The fast double-to-(unsigned-)int conversion routine does not guarantee |
+// rounding towards zero. |
// The result is unspecified if x is infinite or NaN, or if the rounded |
// integer value is outside the range of type int. |
inline int FastD2I(double x) { |
- // The static_cast convertion from double to int used to be slow, but |
- // as new benchmarks show, now it is much faster than lrint(). |
return static_cast<int>(x); |
} |
+ |
inline unsigned int FastD2UI(double x); |