summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/tabs.c46
-rw-r--r--tests/tadd.c31
-rw-r--r--tests/tadd_ui.c2
-rw-r--r--tests/tagm.c2
-rw-r--r--tests/tcan_round.c8
-rw-r--r--tests/tcmp.c35
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++;