@@ -122,6 +122,71 @@ simde_test_debug_printf_(const char* format, ...) {
122122 #define SIMDE_TEST_STRUCT_MODIFIERS static const
123123#endif
124124
125+ HEDLEY_DIAGNOSTIC_PUSH
126+ SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL_
127+
128+ static int
129+ simde_test_equal_f32 (simde_float32 a , simde_float32 b , simde_float32 slop ) {
130+ if (simde_math_isnan (a )) {
131+ return simde_math_isnan (b );
132+ } else if (simde_math_isinf (a )) {
133+ return !((a < b ) || (a > b ));
134+ } else if (slop == SIMDE_FLOAT32_C (0.0 )) {
135+ return !simde_memcmp (& a , & b , sizeof (simde_float32 ));
136+ } else {
137+ simde_float32 lo = a - slop ;
138+ if (HEDLEY_UNLIKELY (lo == a ))
139+ lo = simde_math_nextafterf (a , - SIMDE_MATH_INFINITYF );
140+
141+ simde_float32 hi = a + slop ;
142+ if (HEDLEY_UNLIKELY (hi == a ))
143+ hi = simde_math_nextafterf (a , SIMDE_MATH_INFINITYF );
144+
145+ return ((b >= lo ) && (b <= hi ));
146+ }
147+ }
148+
149+ static int
150+ simde_test_equal_f16 (simde_float16 a , simde_float16 b , simde_float16 slop ) {
151+ simde_float32
152+ af = simde_float16_to_float32 (a ),
153+ bf = simde_float16_to_float32 (b ),
154+ slopf = simde_float16_to_float32 (slop );
155+ return simde_test_equal_f32 (af , bf , slopf );
156+ }
157+
158+ static int
159+ simde_test_equal_f64 (simde_float64 a , simde_float64 b , simde_float64 slop ) {
160+ if (simde_math_isnan (a )) {
161+ return simde_math_isnan (b );
162+ } else if (simde_math_isinf (a )) {
163+ return !((a < b ) || (a > b ));
164+ } else if (slop == SIMDE_FLOAT64_C (0.0 )) {
165+ return !simde_memcmp (& a , & b , sizeof (simde_float64 ));
166+ } else {
167+ simde_float64 lo = a - slop ;
168+ if (HEDLEY_UNLIKELY (lo == a ))
169+ lo = simde_math_nextafter (a , - SIMDE_MATH_INFINITY );
170+
171+ simde_float64 hi = a + slop ;
172+ if (HEDLEY_UNLIKELY (hi == a ))
173+ hi = simde_math_nextafter (a , SIMDE_MATH_INFINITY );
174+
175+ return ((b >= lo ) && (b <= hi ));
176+ }
177+ }
178+
179+ static int
180+ simde_test_equal_bf16 (simde_bfloat16 a , simde_bfloat16 b , simde_bfloat16 slop ) {
181+ simde_float32
182+ af = simde_bfloat16_to_float32 (a ),
183+ bf = simde_bfloat16_to_float32 (b ),
184+ slopf = simde_bfloat16_to_float32 (slop );
185+ return simde_test_equal_f32 (af , bf , slopf );
186+ }
187+
188+ HEDLEY_DIAGNOSTIC_POP
189+
125190HEDLEY_PRINTF_FORMAT (3 , 4 )
126191static void
127192simde_test_codegen_snprintf_ (char * str , size_t size , const char * format , ...) {
@@ -153,6 +218,8 @@ static void
153218simde_test_codegen_f32 (size_t buf_len , char buf [HEDLEY_ARRAY_PARAM (buf_len )], simde_float32 value ) {
154219 if (simde_math_isnan (value )) {
155220 simde_test_codegen_snprintf_ (buf , buf_len , " SIMDE_MATH_NANF" );
221+ } else if (simde_test_equal_f32 (value , SIMDE_MATH_FLT_MAX , simde_math_powf (SIMDE_FLOAT32_C (10.0 ), SIMDE_FLOAT32_C (-1.0 )))) {
222+ simde_test_codegen_snprintf_ (buf , buf_len , " SIMDE_MATH_FLT_MAX" );
156223 } else if (simde_math_isinf (value )) {
157224 simde_test_codegen_snprintf_ (buf , buf_len , "%5cSIMDE_MATH_INFINITYF" , value < 0 ? '-' : ' ' );
158225 } else {
@@ -734,71 +801,6 @@ SIMDE_TEST_CODEGEN_WRITE_SCALAR_FUNC_(simde_bfloat16, bf16)
734801#define simde_test_codegen_write_1p64 (indent , value ) simde_test_codegen_write_p64_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
735802#define simde_test_codegen_write_1bf16 (indent , value ) simde_test_codegen_write_bf16_full((indent), #value, (value), SIMDE_TEST_VEC_POS_SINGLE)
736803
737- HEDLEY_DIAGNOSTIC_PUSH
738- SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL_
739-
740- static int
741- simde_test_equal_f32 (simde_float32 a , simde_float32 b , simde_float32 slop ) {
742- if (simde_math_isnan (a )) {
743- return simde_math_isnan (b );
744- } else if (simde_math_isinf (a )) {
745- return !((a < b ) || (a > b ));
746- } else if (slop == SIMDE_FLOAT32_C (0.0 )) {
747- return !simde_memcmp (& a , & b , sizeof (simde_float32 ));
748- } else {
749- simde_float32 lo = a - slop ;
750- if (HEDLEY_UNLIKELY (lo == a ))
751- lo = simde_math_nextafterf (a , - SIMDE_MATH_INFINITYF );
752-
753- simde_float32 hi = a + slop ;
754- if (HEDLEY_UNLIKELY (hi == a ))
755- hi = simde_math_nextafterf (a , SIMDE_MATH_INFINITYF );
756-
757- return ((b >= lo ) && (b <= hi ));
758- }
759- }
760-
761- static int
762- simde_test_equal_f16 (simde_float16 a , simde_float16 b , simde_float16 slop ) {
763- simde_float32
764- af = simde_float16_to_float32 (a ),
765- bf = simde_float16_to_float32 (b ),
766- slopf = simde_float16_to_float32 (slop );
767- return simde_test_equal_f32 (af , bf , slopf );
768- }
769-
770- static int
771- simde_test_equal_f64 (simde_float64 a , simde_float64 b , simde_float64 slop ) {
772- if (simde_math_isnan (a )) {
773- return simde_math_isnan (b );
774- } else if (simde_math_isinf (a )) {
775- return !((a < b ) || (a > b ));
776- } else if (slop == SIMDE_FLOAT64_C (0.0 )) {
777- return !simde_memcmp (& a , & b , sizeof (simde_float64 ));
778- } else {
779- simde_float64 lo = a - slop ;
780- if (HEDLEY_UNLIKELY (lo == a ))
781- lo = simde_math_nextafter (a , - SIMDE_MATH_INFINITY );
782-
783- simde_float64 hi = a + slop ;
784- if (HEDLEY_UNLIKELY (hi == a ))
785- hi = simde_math_nextafter (a , SIMDE_MATH_INFINITY );
786-
787- return ((b >= lo ) && (b <= hi ));
788- }
789- }
790-
791- static int
792- simde_test_equal_bf16 (simde_bfloat16 a , simde_bfloat16 b , simde_bfloat16 slop ) {
793- simde_float32
794- af = simde_bfloat16_to_float32 (a ),
795- bf = simde_bfloat16_to_float32 (b ),
796- slopf = simde_bfloat16_to_float32 (slop );
797- return simde_test_equal_f32 (af , bf , slopf );
798- }
799-
800- HEDLEY_DIAGNOSTIC_POP
801-
802804static simde_float16
803805simde_test_f16_precision_to_slop (int precision ) {
804806 return HEDLEY_UNLIKELY (precision == INT_MAX ) ? SIMDE_FLOAT16_VALUE (0.0 ) : simde_float16_from_float32 (simde_math_powf (SIMDE_FLOAT32_C (10.0 ), - HEDLEY_STATIC_CAST (float , precision )));
0 commit comments