Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/tests/gen/fpsetround_test.c
289379 views
1
/* $NetBSD: t_fpsetround.c,v 1.6 2011/10/01 17:46:10 christos Exp $ */
2
3
/*-
4
* Copyright (c) 2011 The NetBSD Foundation, Inc.
5
* All rights reserved.
6
*
7
* This code is derived from software contributed to The NetBSD Foundation
8
* by Christos Zoulas.
9
*
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
12
* are met:
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
18
* 3. All advertising materials mentioning features or use of this software
19
* must display the following acknowledgement:
20
* This product includes software developed by the NetBSD
21
* Foundation, Inc. and its contributors.
22
* 4. Neither the name of The NetBSD Foundation nor the names of its
23
* contributors may be used to endorse or promote products derived
24
* from this software without specific prior written permission.
25
*
26
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36
* POSSIBILITY OF SUCH DAMAGE.
37
*/
38
#include <sys/cdefs.h>
39
__RCSID("$NetBSD: t_fpsetround.c,v 1.6 2011/10/01 17:46:10 christos Exp $");
40
41
#include <float.h>
42
#include <math.h>
43
#include <stdlib.h>
44
#include <string.h>
45
#include <stdio.h>
46
47
#include <atf-c.h>
48
49
ATF_TC(fpsetround_basic);
50
ATF_TC_HEAD(fpsetround_basic, tc)
51
{
52
53
atf_tc_set_md_var(tc, "descr",
54
"Minimal testing of fpgetround(3) and fpsetround(3)");
55
}
56
57
#ifdef __i386__
58
#include <ieeefp.h>
59
#define __arraycount(a) (sizeof(a) / sizeof(*(a)))
60
61
static const struct {
62
const char *n;
63
int rm;
64
int rf;
65
} rnd[] = {
66
{ "RN", FP_RN, 1 },
67
{ "RP", FP_RP, 2 },
68
{ "RM", FP_RM, 3 },
69
{ "RZ", FP_RZ, 0 },
70
71
};
72
73
static const struct {
74
const char *n;
75
int v[4];
76
} tst[] = { /* RN RP RM RZ */
77
{ "1.1", { 1, 1, 2, 1 } },
78
{ "1.5", { 1, 2, 2, 1 } },
79
{ "1.9", { 1, 2, 2, 1 } },
80
{ "2.1", { 2, 2, 3, 2 } },
81
{ "2.5", { 2, 2, 3, 2 } },
82
{ "2.9", { 2, 3, 3, 2 } },
83
{ "-1.1", { -1, -1, -1, -2 } },
84
{ "-1.5", { -1, -2, -1, -2 } },
85
{ "-1.9", { -1, -2, -1, -2 } },
86
{ "-2.1", { -2, -2, -2, -3 } },
87
{ "-2.5", { -2, -2, -2, -3 } },
88
{ "-2.9", { -2, -3, -2, -3 } },
89
};
90
91
static const char *
92
getname(int r)
93
{
94
for (size_t i = 0; i < __arraycount(rnd); i++)
95
if (rnd[i].rm == r)
96
return rnd[i].n;
97
return "*unknown*";
98
}
99
100
static void
101
test(int r)
102
{
103
int did = 0;
104
for (size_t i = 0; i < __arraycount(tst); i++) {
105
double d = strtod(tst[i].n, NULL);
106
int g = (int)rint(d);
107
int e = tst[i].v[r];
108
ATF_CHECK_EQ(g, e);
109
if (g != e) {
110
if (!did) {
111
fprintf(stderr, "Mode Value Result Expected\n");
112
did = 1;
113
}
114
fprintf(stderr, "%4.4s %-5.5s %6d %8d\n", rnd[r].n,
115
tst[i].n, (int)rint(d), tst[i].v[r]);
116
}
117
}
118
}
119
#endif
120
121
122
ATF_TC_BODY(fpsetround_basic, tc)
123
{
124
125
#ifndef __i386__
126
atf_tc_skip("Test not applicable on this architecture.");
127
#else
128
int r;
129
130
ATF_CHECK_EQ(r = fpgetround(), FP_RN);
131
if (FP_RN != r)
132
fprintf(stderr, "default expected=%s got=%s\n", getname(FP_RN),
133
getname(r));
134
ATF_CHECK_EQ(FLT_ROUNDS, 1);
135
136
for (size_t i = 0; i < __arraycount(rnd); i++) {
137
const size_t j = (i + 1) & 3;
138
const int o = rnd[i].rm;
139
const int n = rnd[j].rm;
140
141
ATF_CHECK_EQ(r = fpsetround(n), o);
142
if (o != r)
143
fprintf(stderr, "set %s expected=%s got=%s\n",
144
getname(n), getname(o), getname(r));
145
ATF_CHECK_EQ(r = fpgetround(), n);
146
if (n != r)
147
fprintf(stderr, "get expected=%s got=%s\n", getname(n),
148
getname(r));
149
ATF_CHECK_EQ(r = FLT_ROUNDS, rnd[j].rf);
150
if (r != rnd[j].rf)
151
fprintf(stderr, "rounds expected=%x got=%x\n",
152
rnd[j].rf, r);
153
test(r);
154
}
155
#endif /* __i386__ */
156
}
157
158
ATF_TP_ADD_TCS(tp)
159
{
160
161
ATF_TP_ADD_TC(tp, fpsetround_basic);
162
163
return atf_no_error();
164
}
165
166