aboutsummaryrefslogtreecommitdiff
path: root/contrib/netbsd-tests/lib/libm/t_bit.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/netbsd-tests/lib/libm/t_bit.c')
-rw-r--r--contrib/netbsd-tests/lib/libm/t_bit.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/contrib/netbsd-tests/lib/libm/t_bit.c b/contrib/netbsd-tests/lib/libm/t_bit.c
new file mode 100644
index 000000000000..b6e0218f601c
--- /dev/null
+++ b/contrib/netbsd-tests/lib/libm/t_bit.c
@@ -0,0 +1,102 @@
+/* $NetBSD: t_bit.c,v 1.1 2019/04/26 08:52:16 maya Exp $ */
+
+/*
+ * Written by Maya Rashish <maya@NetBSD.org>
+ * Public domain.
+ *
+ * Testing signbit{,f,l} function correctly
+ */
+
+#include <atf-c.h>
+#include <float.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+static const struct {
+ double input;
+ bool is_negative;
+} values[] = {
+ { -1, true},
+ { -123, true},
+ { -123E6, true},
+#ifdef INFINITY
+ { -INFINITY, true},
+ { INFINITY, false},
+#endif
+ { 123E6, false},
+ { 0, false},
+ { -FLT_MIN, true},
+ { FLT_MIN, false},
+ /*
+ * Cannot be accurately represented as float,
+ * but sign should be preserved
+ */
+ { DBL_MAX, false},
+ { -DBL_MAX, true},
+};
+
+#ifdef __HAVE_LONG_DOUBLE
+static const struct {
+ long double input;
+ bool is_negative;
+} ldbl_values[] = {
+ { -LDBL_MIN, true},
+ { LDBL_MIN, false},
+ { LDBL_MAX, false},
+ { -LDBL_MAX, true},
+};
+#endif
+
+ATF_TC(signbit);
+ATF_TC_HEAD(signbit, tc)
+{
+ atf_tc_set_md_var(tc, "descr","Check that signbit functions correctly");
+}
+
+ATF_TC_BODY(signbit, tc)
+{
+ double iterator_d;
+ float iterator_f;
+
+ for (unsigned int i = 0; i < __arraycount(values); i++) {
+ iterator_d = values[i].input;
+ iterator_f = (float) values[i].input;
+ if (signbit(iterator_f) != values[i].is_negative)
+ atf_tc_fail("%s:%d iteration %d signbitf is wrong"
+ " about the sign of %f", __func__,
+ __LINE__, i, iterator_f);
+ if (signbit(iterator_d) != values[i].is_negative)
+ atf_tc_fail("%s:%d iteration %d signbit is wrong"
+ "about the sign of %f", __func__,
+ __LINE__,i, iterator_d);
+
+#ifdef __HAVE_LONG_DOUBLE
+ long double iterator_l = values[i].input;
+ if (signbit(iterator_l) != values[i].is_negative)
+ atf_tc_fail("%s:%d iteration %d signbitl is wrong"
+ " about the sign of %Lf", __func__,
+ __LINE__, i, iterator_l);
+#endif
+ }
+
+#ifdef __HAVE_LONG_DOUBLE
+ for (unsigned int i = 0; i < __arraycount(ldbl_values); i++) {
+ if (signbit(ldbl_values[i].input) != ldbl_values[i].is_negative)
+ atf_tc_fail("%s:%d iteration %d signbitl is"
+ "wrong about the sign of %Lf",
+ __func__, __LINE__, i,
+ ldbl_values[i].input);
+ }
+#endif
+
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ ATF_TP_ADD_TC(tp, signbit);
+
+ return atf_no_error();
+}