X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-fmod.h;h=a513857378c3cf7f1e405f7d1886e7ca8c1b6b3c;hb=0f5a4162a9a8361be7e1c63b8e438002bfdee945;hp=3092860d310c20e0bf73dae41c6bd52119e3bf75;hpb=3261e6f0337130c6bbde8db61e28c87bb901d749;p=gnulib.git diff --git a/tests/test-fmod.h b/tests/test-fmod.h index 3092860d3..a51385737 100644 --- a/tests/test-fmod.h +++ b/tests/test-fmod.h @@ -14,6 +14,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +static DOUBLE +my_ldexp (DOUBLE x, int d) +{ + for (; d > 0; d--) + x *= L_(2.0); + for (; d < 0; d++) + x *= L_(0.5); + return x; +} + static void test_function (void) { @@ -30,8 +40,8 @@ test_function (void) * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5)); /* Randomized tests. */ - for (i = 0; i < SIZEOF (RANDOM); i++) - for (j = 0; j < SIZEOF (RANDOM); j++) + for (i = 0; i < SIZEOF (RANDOM) / 5; i++) + for (j = 0; j < SIZEOF (RANDOM) / 5; j++) { DOUBLE x = L_(16.0) * RANDOM[i]; /* 0.0 <= x <= 16.0 */ DOUBLE y = RANDOM[j]; /* 0.0 <= y < 1.0 */ @@ -53,8 +63,8 @@ test_function (void) } } - for (i = 0; i < SIZEOF (RANDOM); i++) - for (j = 0; j < SIZEOF (RANDOM); j++) + for (i = 0; i < SIZEOF (RANDOM) / 5; i++) + for (j = 0; j < SIZEOF (RANDOM) / 5; j++) { DOUBLE x = L_(1.0e9) * RANDOM[i]; /* 0.0 <= x <= 10^9 */ DOUBLE y = RANDOM[j]; /* 0.0 <= y < 1.0 */ @@ -87,6 +97,25 @@ test_function (void) && z < - y + L_(2.0) * L_(1.0e9) / TWO_MANT_DIG)); } } + + { + int large_exp = (MAX_EXP - 1 < 1000 ? MAX_EXP - 1 : 1000); + DOUBLE large = my_ldexp (L_(1.0), large_exp); /* = 2^large_exp */ + for (i = 0; i < SIZEOF (RANDOM) / 10; i++) + for (j = 0; j < SIZEOF (RANDOM) / 10; j++) + { + DOUBLE x = large * RANDOM[i]; /* 0.0 <= x <= 2^large_exp */ + DOUBLE y = RANDOM[j]; /* 0.0 <= y < 1.0 */ + if (y > L_(0.0)) + { + DOUBLE z = FMOD (x, y); + /* Regardless how large the rounding errors are, the result + must be >= 0, < y. */ + ASSERT (z >= L_(0.0)); + ASSERT (z < y); + } + } + } } volatile DOUBLE x;