ARM testers, make note.
Johannes Pfau
nospam at example.com
Thu Aug 22 11:45:17 PDT 2013
Am Fri, 16 Aug 2013 18:33:14 +0200
schrieb "Iain Buclaw" <ibuclaw at ubuntu.com>:
> I've pushed in pure implementations of functions in std.math,
> removing the workaround in core.stdc.math.
>
> This passes for x64/x32. Can any ARM testers please report any
> problems causecd by this update?
>
> Thanks
> Iain.
I did a complete pass through the std.math unit tests. As soon as these
issues are addressed, std.math unit tests should succeed on ARM:
Some more small bugs:
(see also
https://github.com/jpf91/GDC/commit/63890f543f60d55bad3dc6bced4d14bc159128e6
)
==========================
In isInfinity we should check for 11 binary '1's, not 12 right?
return ((*cast(ulong *)&x) & 0x7FFF_FFFF_FFFF_FFFF)
== 0x7FF8_0000_0000_0000;
=>
return ((*cast(ulong *)&x) & 0x7FFF_FFFF_FFFF_FFFF)
== 0x7FF0_0000_0000_0000;
==========================
In frexp:
vu[F.EXPPOS_SHORT] = cast(ushort)((0x8000 & vu[F.EXPPOS_SHORT]) |
0x3FE0);
=>
vu[F.EXPPOS_SHORT] = cast(ushort)((0x800F & vu[F.EXPPOS_SHORT]) |
0x3FE0);
==========================
Why is ex in frexp unsigned? This line fails because of this:
exp = (ex - 0x3FE0) >> 4;
here ex is always zero so the subtraction doesn't work as ex is
unsigned
==========================
Failing unit tests:
(see also
https://github.com/jpf91/GDC/commit/0d7b3feafdb3629aeccb44b2a28d3344c7675d2f
)
==========================
assert(exp2(0.5L)== SQRT2); //Only 52 mantissa bits are equal
==========================
real n = frexp(0x1p-16384L, x); //value is too small to fit in double
==========================
real y = vals[i][1];
real z = vals[i][2];
real h = hypot(x, y);
For some values only 52 mantissa bits are equal
==========================
assert(pow(xf, neg8) == 1 / ((x * x) * (x * x) * (x * x) * (x * x)));
//Only 52 mantissa bits are equal
==========================
assert(pow(xf, neg8) == 1 / ((x * x) * (x * x) * (x * x) * (x * x)));
Fails in exactly the same way on dpaste:
http://dpaste.dzfl.pl/4c794ab8
==========================
assert(pow(x, neg3) == 1 / (x * x * x));
//Only 52 mantissa bits are equal
==========================
assert(feqrel(real.min_normal / 8, real.min_normal / 17) == 3);
//feqrel returns spectacular -732 equal bits. But it's the same on x86
//with double so it's a bug in the test case. I can't fix it as I
//don't know what it's supposed to do
More information about the D.gnu
mailing list