From 40a25a2a4885112e70ae335be2d404d6d3609309 Mon Sep 17 00:00:00 2001 From: Jonathan Wilkes <jon.w.wilkes@gmail.com> Date: Wed, 23 May 2018 13:18:42 -0400 Subject: [PATCH] use uint32_t to ensure alignment in union, improve comments --- pd/src/m_pd.h | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/pd/src/m_pd.h b/pd/src/m_pd.h index be41e2173..fa41e85bd 100644 --- a/pd/src/m_pd.h +++ b/pd/src/m_pd.h @@ -772,10 +772,11 @@ defined, there is a "te_xpix" field in objects, not a "te_xpos" as before: */ typedef union { t_float f; - unsigned int ui; + uint32_t ui; }t_bigorsmall32; -static inline int PD_BADFLOAT(t_float f) // test for NANs, infs and denormals +/* Test strictly for NANs and infs */ +static inline int PD_BADFLOAT(t_float f) { t_bigorsmall32 pun; pun.f = f; @@ -783,7 +784,13 @@ static inline int PD_BADFLOAT(t_float f) // test for NANs, infs and denormals return((pun.ui == 0) | (pun.ui == 0x7f800000)); } -static inline int PD_BIGORSMALL(t_float f) // > abs(2^64) or < abs(2^-64) +/* Test to find unusually large or small normal values, in + addition to denormals, NANs and infs: + f > abs(2^65) or < abs(2^-63) + + This is useful for catching extreme values in, say, a filter, + then bashing to zero before ever calculating a denormal. */ +static inline int PD_BIGORSMALL(t_float f) { t_bigorsmall32 pun; pun.f = f; @@ -795,10 +802,11 @@ static inline int PD_BIGORSMALL(t_float f) // > abs(2^64) or < abs(2^-64) typedef union { t_float f; - unsigned int ui[2]; + uint32_t ui[2]; }t_bigorsmall64; -static inline int PD_BADFLOAT(t_float f) // test for NANs, infs and denormals +/* Test for NANs and infs */ +static inline int PD_BADFLOAT(t_float f) { t_bigorsmall64 pun; pun.f = f; @@ -806,7 +814,13 @@ static inline int PD_BADFLOAT(t_float f) // test for NANs, infs and denormals return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } -static inline int PD_BIGORSMALL(t_float f) // > abs(2^512) or < abs(2^-512) +/* Test to find unusually large or small normal values, in + addition to denormals, NANs and infs: + f > abs(2^513) or < abs(2^-511) + + This is useful for catching extreme values in, say, a filter, + then bashing to zero before ever calculating a denormal. */ +static inline int PD_BIGORSMALL(t_float f) { t_bigorsmall64 pun; pun.f = f; -- GitLab