diff options
-rw-r--r-- | tests/tabs.c | 46 | ||||
-rw-r--r-- | tests/tadd.c | 31 | ||||
-rw-r--r-- | tests/tadd_ui.c | 2 | ||||
-rw-r--r-- | tests/tagm.c | 2 | ||||
-rw-r--r-- | tests/tcan_round.c | 8 | ||||
-rw-r--r-- | tests/tcmp.c | 35 |
6 files changed, 108 insertions, 16 deletions
diff --git a/tests/tabs.c b/tests/tabs.c index dd1df1c6f..8b86cf164 100644 --- a/tests/tabs.c +++ b/tests/tabs.c @@ -27,6 +27,7 @@ MA 02111-1307, USA. */ #ifdef __mips #include <sys/fpu.h> #endif +#define Infp 1/0. extern int isnan(); @@ -55,22 +56,35 @@ int main(int argc, char *argv[]) fprintf(stderr, "Error in mpfr_abs(-1.0)\n"); exit(1); } - n = (argc==1) ? 1000000 : atoi(argv[1]); - for (k = 1; k <= n; k++) - { - d = drand(); - rnd = rand() % 4; - mpfr_set_d(x, d, 0); - mpfr_abs(x, x, rnd); - dd = mpfr_get_d(x); - if (dd != fabs(d) && !isnan(d)) - { - fprintf(stderr, - "Mismatch on d = %1.18g\n", d); - mpfr_print_raw(x); putchar('\n'); - exit(1); - } - } + mpfr_set_d(x, -6/-0., GMP_RNDN); + mpfr_abs(x, x, GMP_RNDN); + if (mpfr_get_d(x) != Infp) { + fprintf(stderr, "Error in mpfr_abs(Inf).\n"); exit(1); + } + + mpfr_set_d(x, 2/-0., GMP_RNDN); + mpfr_abs(x, x, GMP_RNDN); + if (mpfr_get_d(x) != Infp) { + fprintf(stderr, "Error in mpfr_abs(-Inf).\n"); exit(1); + } + + + n = (argc==1) ? 1000000 : atoi(argv[1]); + for (k = 1; k <= n; k++) + { + d = drand(); + rnd = rand() % 4; + mpfr_set_d(x, d, 0); + mpfr_abs(x, x, rnd); + dd = mpfr_get_d(x); + if (dd != fabs(d) && !isnan(d)) + { + fprintf(stderr, + "Mismatch on d = %1.18g\n", d); + mpfr_print_raw(x); putchar('\n'); + exit(1); + } + } mpfr_clear(x); return 0; diff --git a/tests/tadd.c b/tests/tadd.c index 84d8d3e58..6cc141848 100644 --- a/tests/tadd.c +++ b/tests/tadd.c @@ -64,6 +64,28 @@ unsigned int py, unsigned int pz, double z1) mpfr_clear(xx); mpfr_clear(yy); mpfr_clear(zz); } +void checknan(double x, double y, unsigned int rnd_mode, unsigned int px, +unsigned int py, unsigned int pz) +{ + double z2; mpfr_t xx,yy,zz; int cert=0; + + mpfr_init2(xx, px); + mpfr_init2(yy, py); + mpfr_init2(zz, pz); + mpfr_set_d(xx, x, rnd_mode); + mpfr_set_d(yy, y, rnd_mode); + mpfr_add(zz, xx, yy, rnd_mode); +#ifdef TEST + mpfr_set_machine_rnd_mode(rnd_mode); + if (px==53 && py==53 && pz==53) cert=1; +#endif + if (MPFR_IS_NAN(zz) == 0) { printf("Error, not an MPFR_NAN for xx = %1.20e, y = %1.20e\n", x, y); exit(1); } + z2 = mpfr_get_d(zz); + if (!isnan(z2)) { printf("Error, not a NaN after conversion, xx = %1.20e yy = %1.20e\n", x, y); exit(1); } + + mpfr_clear(xx); mpfr_clear(yy); mpfr_clear(zz); +} + #ifdef TEST /* idem than check for mpfr_add(x, x, y) */ void check3(double x, double y, unsigned int rnd_mode) @@ -296,6 +318,7 @@ void check_same() } #define check53(x, y, r, z) check(x, y, r, 53, 53, 53, z) +#define check53nan(x, y, r) checknan(x, y, r, 53, 53, 53); int main(argc,argv) int argc; char *argv[]; { @@ -475,6 +498,14 @@ int main(argc,argv) int argc; char *argv[]; /* test denormalized numbers too */ check53(8.06294740693074521573e-310, 6.95250701071929654575e-310, GMP_RNDU, 1.5015454417650041761e-309); + check53(1/0., 6.95250701071929654575e-310, GMP_RNDU, 1/0.); + check53(-1/0., 6.95250701071929654575e-310, GMP_RNDU, -1/0.); + check53(6.95250701071929654575e-310, 1/0., GMP_RNDU, 1/0.); + check53(6.95250701071929654575e-310, -1/0., GMP_RNDU, -1/0.); + + check53nan(1/0., -1/0., GMP_RNDN); + + #ifdef TEST /* Comparing to double precision using machine arithmetic */ for (i=0;i<N;i++) { diff --git a/tests/tadd_ui.c b/tests/tadd_ui.c index faa4cd171..9a3438421 100644 --- a/tests/tadd_ui.c +++ b/tests/tadd_ui.c @@ -94,6 +94,8 @@ int main(argc,argv) int argc; char *argv[]; check3(-6.72658901114033715233e-165, 2000878121, GMP_RNDZ, 2.0008781209999997615e9); check3(-2.0769715792901673e-5, 880524, GMP_RNDN, 8.8052399997923023e5); + check3(1/0., 2394875, GMP_RNDN, 1/0.); + check3(-1/0., 2394875, GMP_RNDN, -1/0.); return 0; } diff --git a/tests/tagm.c b/tests/tagm.c index 767db68c4..25e0b11e2 100644 --- a/tests/tagm.c +++ b/tests/tagm.c @@ -184,5 +184,7 @@ int main(int argc, char* argv[]) { check4(1.0, 44.0, GMP_RNDU, 1.33658354512981247808e1); check4(1.0, 3.7252902984619140625e-9, GMP_RNDU, 7.55393356971199025907e-02); } + + /* TODO : tests des infinis dans tagm.c */ return 0; } diff --git a/tests/tcan_round.c b/tests/tcan_round.c index db42e6668..f32b68de0 100644 --- a/tests/tcan_round.c +++ b/tests/tcan_round.c @@ -35,6 +35,14 @@ int main() if (mpfr_can_round(x, 54, GMP_RNDZ, GMP_RNDZ, 53) != 0) { fprintf(stderr, "Error in mpfr_can_round\n"); exit(1); } + + mpfr_set_str_raw(x, "-Inf"); + if (mpfr_can_round(x, 2000, GMP_RNDZ, GMP_RNDZ, 2000) != 0) { + fprintf(stderr, "Error in mpfr_can_round\n"); exit(1); + } mpfr_clear(x); return 0; } + + + diff --git a/tests/tcmp.c b/tests/tcmp.c index 002a77e1d..0efc9d83b 100644 --- a/tests/tcmp.c +++ b/tests/tcmp.c @@ -27,6 +27,9 @@ MA 02111-1307, USA. */ #include "mpfr.h" #include "mpfr-impl.h" +#define Infp 1/0. +#define Infm -1/0. + extern int isnan(); int main() @@ -63,6 +66,38 @@ int main() exit(1); } + mpfr_set_d(xx, Infp, GMP_RNDN); + mpfr_set_d(yy, -23489745.0329, GMP_RNDN); + if (mpfr_cmp(xx, yy) <= 0) { + fprintf(stderr, + "Error in mpfr_cmp(Infp, 23489745.0329), gives %d\n", mpfr_cmp(xx, yy)); + exit(1); + } + + mpfr_set_d(xx, Infp, GMP_RNDN); + mpfr_set_d(yy, Infm, GMP_RNDN); + if (mpfr_cmp(xx, yy) <= 0) { + fprintf(stderr, + "Error in mpfr_cmp(Infp, Infm), gives %d\n", mpfr_cmp(xx, yy)); + exit(1); + } + + mpfr_set_d(xx, Infm, GMP_RNDN); + mpfr_set_d(yy, Infp, GMP_RNDN); + if (mpfr_cmp(xx, yy) >= 0) { + fprintf(stderr, + "Error in mpfr_cmp(Infm, Infp), gives %d\n", mpfr_cmp(xx, yy)); + exit(1); + } + + mpfr_set_d(xx, Infm, GMP_RNDN); + mpfr_set_d(yy, 2346.09234, GMP_RNDN); + if (mpfr_cmp(xx, yy) >= 0) { + fprintf(stderr, + "Error in mpfr_cmp(Infm, 2346.09234), gives %d\n", mpfr_cmp(xx, yy)); + exit(1); + } + for (i=0;i<1000000;) { x=drand(); y=drand(); if (!isnan(x) && !isnan(y)) { i++; |