summaryrefslogtreecommitdiff
path: root/libavutil/libm.h
diff options
context:
space:
mode:
Diffstat (limited to 'libavutil/libm.h')
-rw-r--r--libavutil/libm.h34
1 files changed, 32 insertions, 2 deletions
diff --git a/libavutil/libm.h b/libavutil/libm.h
index 6c17b287b4..221c2867c5 100644
--- a/libavutil/libm.h
+++ b/libavutil/libm.h
@@ -83,23 +83,53 @@ static av_always_inline float cbrtf(float x)
#endif /* HAVE_EXP2F */
#if !HAVE_ISINF
-static av_always_inline av_const int isinf(float x)
+#undef isinf
+/* Note: these do not follow the BSD/Apple/GNU convention of returning -1 for
+-Inf, +1 for Inf, 0 otherwise, but merely follow the POSIX/ISO mandated spec of
+returning a non-zero value for +/-Inf, 0 otherwise. */
+static av_always_inline av_const int avpriv_isinff(float x)
{
uint32_t v = av_float2int(x);
if ((v & 0x7f800000) != 0x7f800000)
return 0;
return !(v & 0x007fffff);
}
+
+static av_always_inline av_const int avpriv_isinf(double x)
+{
+ uint64_t v = av_double2int(x);
+ if ((v & 0x7ff0000000000000) != 0x7ff0000000000000)
+ return 0;
+ return !(v & 0x000fffffffffffff);
+}
+
+#define isinf(x) \
+ (sizeof(x) == sizeof(float) \
+ ? avpriv_isinff(x) \
+ : avpriv_isinf(x))
#endif /* HAVE_ISINF */
#if !HAVE_ISNAN
-static av_always_inline av_const int isnan(float x)
+static av_always_inline av_const int avpriv_isnanf(float x)
{
uint32_t v = av_float2int(x);
if ((v & 0x7f800000) != 0x7f800000)
return 0;
return v & 0x007fffff;
}
+
+static av_always_inline av_const int avpriv_isnan(double x)
+{
+ uint64_t v = av_double2int(x);
+ if ((v & 0x7ff0000000000000) != 0x7ff0000000000000)
+ return 0;
+ return v & 0x000fffffffffffff;
+}
+
+#define isnan(x) \
+ (sizeof(x) == sizeof(float) \
+ ? avpriv_isnanf(x) \
+ : avpriv_isnan(x))
#endif /* HAVE_ISNAN */
#if !HAVE_LDEXPF