summaryrefslogtreecommitdiff
path: root/tests/tget_d.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2002-03-26 09:40:06 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2002-03-26 09:40:06 +0000
commite3f775ca512dc4095a539f08f835095ace60653b (patch)
treea91a12997883efaa17df339c5d773c298550bec8 /tests/tget_d.c
parent1fc42ba93fd722307796c9aed50c5be3bd95be98 (diff)
downloadmpfr-e3f775ca512dc4095a539f08f835095ace60653b.tar.gz
fixed problem on x86 (set precision to double to avoid double rounding)
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1778 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'tests/tget_d.c')
-rw-r--r--tests/tget_d.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/tests/tget_d.c b/tests/tget_d.c
index d8ef44771..4138c646d 100644
--- a/tests/tget_d.c
+++ b/tests/tget_d.c
@@ -27,6 +27,23 @@ MA 02111-1307, USA. */
#include "mpfr-impl.h"
#include "mpfr-test.h"
+#if (defined (__i386__) || defined (__i486__))
+#ifdef __CYGWIN32__ /* no fpu_control.h under Cygnus */
+#define _FPU_EXTENDED 0x300
+#define _FPU_DOUBLE 0x200
+#define _FPU_DEFAULT 0x137f
+#define _FPU_RC_NEAREST 0x0
+#define _FPU_RC_DOWN 0x400
+#define _FPU_RC_UP 0x800
+#define _FPU_RC_ZERO 0xC00
+#else
+#include <fpu_control.h>
+#endif /* ifdef __CYGWIN32__ */
+#ifndef __setfpucw
+#define __setfpucw(cw) __asm__ ("fldcw %0" : : "m" (cw))
+#endif /* ifndef __setfpucw */
+#endif /* __i386__ */
+
int
main (void)
{
@@ -43,6 +60,11 @@ main (void)
mpfr_init2(x, 128);
mpfr_init2(y, 128);
+#if defined(__i386__)
+ /* sets the precision to double */
+ __setfpucw((_FPU_DEFAULT & (~_FPU_EXTENDED)) | _FPU_DOUBLE);
+#endif
+
for (rnd_mode = 0; rnd_mode <= 3; rnd_mode++)
{
int i, j, si, sj;
@@ -52,8 +74,9 @@ main (void)
for (i = 1, di = 0.25; i < 127; i++, di *= 0.5)
for (si = 0; si <= 1; si++)
{
- mpfr_div_2ui(x, half, i, GMP_RNDZ);
+ mpfr_div_2ui (x, half, i, GMP_RNDZ);
(si ? mpfr_sub : mpfr_add)(x, half, x, GMP_RNDZ);
+ /* x = 1/2 +/- 1/2^(1+i) */
for (j = i+1, dj = di * 0.5; j < 128 && j < i+53; j++, dj *= 0.5)
for (sj = 0; sj <= 1; sj++)
{
@@ -61,10 +84,11 @@ main (void)
int exp;
char *f;
- mpfr_div_2ui(y, half, j, GMP_RNDZ);
+ mpfr_div_2ui (y, half, j, GMP_RNDZ);
(sj ? mpfr_sub : mpfr_add)(y, x, y, GMP_RNDZ);
+ /* y = 1/2 +/- 1/2^(1+i) +/- 1/2^(1+j) */
exp = (LONG_RAND() % 47) - 23;
- mpfr_mul_2si(y, y, exp, GMP_RNDZ);
+ mpfr_mul_2si (y, y, exp, GMP_RNDZ);
if (mpfr_inexflag_p())
{
fprintf(stderr, "Error in tget_d: inexact flag for "
@@ -76,13 +100,13 @@ main (void)
d = si ? 0.5 - dd : 0.5 + dd;
if ((LONG_RAND() / 1024) & 1)
{
- c = mpfr_get_d2(y, rnd_mode);
+ c = mpfr_get_d2 (y, rnd_mode);
f = "mpfr_get_d2";
}
else
{
exp = (LONG_RAND() % 47) - 23;
- c = mpfr_get_d3(y, exp, rnd_mode);
+ c = mpfr_get_d3 (y, exp, rnd_mode);
f = "mpfr_get_d3";
if (si) /* then real d < 0.5 */
d *= sj && i == 1 ? 4 : 2; /* normalize real d */