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