Switch to unordered floating point compares.

In particular, this gives us desired behavior for NaNs (all compares
involving a NaN evaluate to true).  This in turn allows writing the
canonical isnan() function as "v != v".

Added isnan() to the standard library as well.
This commit is contained in:
Matt Pharr
2012-06-20 13:24:09 -07:00
parent 3bc66136b2
commit 46716aada3
6 changed files with 40 additions and 9 deletions

View File

@@ -1120,6 +1120,26 @@ static inline uniform int64 clock() {
///////////////////////////////////////////////////////////////////////////
// Floating-Point Math
__declspec(safe,cost1)
static inline uniform bool isnan(uniform float v) {
return v != v;
}
__declspec(safe,cost1)
static inline bool isnan(float v) {
return v != v;
}
__declspec(safe,cost1)
static inline uniform bool isnan(uniform double v) {
return v != v;
}
__declspec(safe,cost1)
static inline bool isnan(double v) {
return v != v;
}
__declspec(safe,cost1)
static inline float abs(float a) {
// Floating-point hack: zeroing the high bit clears the sign