Skip to content

Commit 6f26e0e

Browse files
committed
test: allow detection of SIMDE_MATH_FLT_MAX
1 parent 05dda01 commit 6f26e0e

File tree

1 file changed

+67
-65
lines changed

1 file changed

+67
-65
lines changed

test/test.h

Lines changed: 67 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
125190
HEDLEY_PRINTF_FORMAT(3, 4)
126191
static void
127192
simde_test_codegen_snprintf_(char* str, size_t size, const char* format, ...) {
@@ -153,6 +218,8 @@ static void
153218
simde_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-
802804
static simde_float16
803805
simde_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

Comments
 (0)