On 26.11.2010 7:25, Don Clugston wrote:
import std.mathspecial;
import std.stdio;

void main()
{
     real a = 0x1.ff1275ae5b939bcap-41L;
     real b = 0x1.034f2a66cd21p+62L;
     real x = 0x1.4f5afe0ce690d95cp-63L;
     real s = 0x1.0076fc5cc795a06cp+40L;

     real u = a * log(x);
     real t = logGamma(b) - logGamma(a) - logGamma(b) + u + log(s);
     real y = exp(t);
     writefln("%a %a %a %a", logGamma(a), logGamma(b), u, t);
     writefln("%a %a %a %a", log(s), log(x), log(a), log(b));
     assert(y==0x1.c91a61a8fc916338p-7L); // Intel
//    assert(y==0x1.c91a61a8fc91633ap-7L); // AMD
}

On my Intel box, this prints:

0x1.bba4a9f774f49d0ap+4 0x1.543ef272830d3ed4p+67 -0x1.5a8e8efc9cec0dbp-35 -0x1.1
16d582237016688p+2
0x1.bba4a9f774f4c37ap+4 -0x1.5b2fa254744c96d8p+5 -0x1.bba4a9f774fdd508p+4 0x1.57
e75c552cc1d47ep+5

On my AMD desktop, this produces:
0x1.bba4a9f774f49d0cp+4 0x1.543ef272830d3ed4p+67 -0x1.5a8e8efc9cec0dbp-35 
-0x1.116d582237016688p+2
0x1.bba4a9f774f4c37ap+4 -0x1.5b2fa254744c96d8p+5 -0x1.bba4a9f774fdd508p+4 
0x1.57e75c552cc1d47ep+5
core.exception.asserter...@test_amd(16): Assertion failure
replacing the first assert with the second one make it pass, of course.

I suspect that we'll ever see a difference in the last line, which
would indicate a one-bit error in log.
But if all the numbers are the same, and the assert still fails, it's
a one-bit error in exp.
If the values in the last line are the same, but the ones in the first
line are different, it's an error in poly.
Either way, if the assert fails on AMD, we're just about down the asm.
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to