1*73211dcfSmiod /* $OpenBSD: modf_test.c,v 1.2 2023/08/13 06:57:04 miod Exp $ */
2*73211dcfSmiod
3*73211dcfSmiod #include <assert.h>
4*73211dcfSmiod #include <math.h>
599ab8edeStobiasu
699ab8edeStobiasu /* Test for bug introduced in 4.4BSD modf() on sparc */
7*73211dcfSmiod /* Public domain, 2014, Tobias Ulmer <tobiasu@tmux.org> */
899ab8edeStobiasu
999ab8edeStobiasu #define BIGFLOAT (5e15) /* Number large enough to trigger the "big" case */
1099ab8edeStobiasu
11*73211dcfSmiod void
modf_sparc(void)12*73211dcfSmiod modf_sparc(void)
1399ab8edeStobiasu {
1499ab8edeStobiasu double f, i;
1599ab8edeStobiasu
1699ab8edeStobiasu f = modf(BIGFLOAT, &i);
17*73211dcfSmiod assert(i == BIGFLOAT);
18*73211dcfSmiod assert(f == 0.0);
1999ab8edeStobiasu
2099ab8edeStobiasu /* Repeat, maybe we were lucky */
2199ab8edeStobiasu f = modf(BIGFLOAT, &i);
22*73211dcfSmiod assert(i == BIGFLOAT);
23*73211dcfSmiod assert(f == 0.0);
2499ab8edeStobiasu
2599ab8edeStobiasu /* With negative number, for good measure */
2699ab8edeStobiasu f = modf(-BIGFLOAT, &i);
27*73211dcfSmiod assert(i == -BIGFLOAT);
28*73211dcfSmiod assert(f == 0.0);
29*73211dcfSmiod }
3099ab8edeStobiasu
31*73211dcfSmiod /* Test for modf() behaviour on Inf and Nan */
32*73211dcfSmiod /* Written by Willemijn Coene. Public domain */
33*73211dcfSmiod
34*73211dcfSmiod void
modf_infnan(void)35*73211dcfSmiod modf_infnan(void)
36*73211dcfSmiod {
37*73211dcfSmiod double f, i;
38*73211dcfSmiod
39*73211dcfSmiod f = modf(__builtin_inf(), &i);
40*73211dcfSmiod assert(isinf(i));
41*73211dcfSmiod assert(signbit(i) == 0);
42*73211dcfSmiod assert(f == 0.0);
43*73211dcfSmiod
44*73211dcfSmiod f = modf(-__builtin_inf(), &i);
45*73211dcfSmiod assert(isinf(i));
46*73211dcfSmiod assert(signbit(i) != 0);
47*73211dcfSmiod assert(f == -0.0);
48*73211dcfSmiod
49*73211dcfSmiod f = modf(NAN, &i);
50*73211dcfSmiod assert(isnan(i));
51*73211dcfSmiod assert(signbit(i) == 0);
52*73211dcfSmiod assert(isnan(f));
53*73211dcfSmiod assert(signbit(f) == 0);
54*73211dcfSmiod
55*73211dcfSmiod f = modf(-NAN, &i);
56*73211dcfSmiod assert(isnan(i));
57*73211dcfSmiod assert(signbit(i) != 0);
58*73211dcfSmiod assert(isnan(f));
59*73211dcfSmiod assert(signbit(f) != 0);
60*73211dcfSmiod }
61*73211dcfSmiod
62*73211dcfSmiod int
main(void)63*73211dcfSmiod main(void)
64*73211dcfSmiod {
65*73211dcfSmiod modf_sparc();
66*73211dcfSmiod modf_infnan();
6799ab8edeStobiasu }
68