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