s390 debug question
Patrick Pelissier
Patrick.Pelissier at loria.fr
Fri Apr 29 18:10:28 CEST 2005
Which version of MPFR did you use?
--
Patrick Pelissier
On Thu, Apr 28, 2005 at 23:17:25 -0400, Greg Smith wrote:
> Hello,
>
> I am a developer for a s390/s390x (aka IBM mainframe) emulator.
>
> A user who is attempting to build the CentOS linux distribution for
> s390/s390x architecture has reported a problem trying to build gmp-4.1.4
> from the available RHEL rpm. The rpm enables the mpfr portion of gmp.
>
> The error I am working on comes from mpfr/tests/tadd.c It seems the
> problem stems from adding/subtracting a very small number (vsn) to a
> very big number (vbn) using 53 bit precision.
>
> For the testcase below, we are adding (in big-endian representation)
> 0e99ee563b83c5a0 + f0d038ed4fb527de
> which in decimal is
> 2.4888731542366126e-238 + -2.5789977198441930e+235
>
> In both intel and s390 emulation, the answer is
> f0d038ed4fb527dd
> that is, a bit changes. I confess I do not know enough why such a nit
> (vsn) added to a vbn will cause a bit to change, but it does *seem*
> silly.
>
> The problem occurs (on s390 emulation) because
> z1.f != z2.f but
> mpfr_cmp(zz,yy) is true, ummm, I mean 0.
>
> That is, on intel and s390 (emulation), x+y is not the same as mpfr_add
> (x,y) but on s390 mpfr_cmp() says they are equal but on intel it's not.
>
> That the emulator has a bug is my foremost suspicion. Good Lord knows
> we've had more than one, esp. in fp arithmetic. I can try to replicate
> the problem on a real s390, but, unfortunately, this is going to require
> a bit of, umm, negotiation.
>
> What I'm looking for is some pointers or insight on how to debug the
> problem... if anyone can be so kind. I do have a rather lengthy s390
> instruction trace (~50000 lines) that I will be digging in to.
>
> Thanks,
>
> Greg Smith
>
> #include <stdio.h>
> #include "gmp.h"
> #include "mpfr.h"
>
> void _check (double, double, double, mp_rnd_t,
> unsigned int, unsigned int, unsigned int);
>
> typedef union {
> double f;
> unsigned long long i;
> } fi;
>
> int main()
> {
> fi x, y, z1, z2;
> unsigned int p = 53;
> mp_rnd_t r = GMP_RNDZ;
> mpfr_t xx, yy, zz;
> int t;
>
> if (sizeof(double) != sizeof(unsigned long long)) exit(1);
>
> x.i = 0x0e99ee563b83c5a0ull;
> y.i = 0xf0d038ed4fb527deull;
>
> mpfr_init2 (xx, p);
> mpfr_init2 (yy, p);
> mpfr_init2 (zz, p);
>
> mpfr_set_d(xx, x.f, r);
> mpfr_set_d(yy, y.f, r);
>
> z1.f = x.f + y.f;
> mpfr_add(zz, xx, yy, r);
> mpfr_set_machine_rnd_mode(r);
> z2.f = mpfr_get_d1 (zz);
> mpfr_set_d (yy, z2.f, GMP_RNDN);
> t = mpfr_cmp(zz,yy);
>
> printf("%1.16e %1.16e = \n%1.16e + %1.16e\n",z1.f,z2.f,x.f,y.f);
> printf("%16.16llx %16.16llx = %16.16llx + %16.16llx\n",
> z1.i,z2.i,x.i,y.i);
> printf("mpfr_cmp %d z1==z2 %d\n",t,z1.f==z2.f);
> }
>
>
> _______________________________________________
> gmp-discuss mailing list
> gmp-discuss at swox.com
> https://gmplib.org/mailman/listinfo/gmp-discuss
More information about the gmp-discuss
mailing list