www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 14786] New: The built-in exponentiation operator ^^ sometimes

https://issues.dlang.org/show_bug.cgi?id=14786

          Issue ID: 14786
           Summary: The built-in exponentiation operator ^^ sometimes
                    returns a value with the wrong sign.
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: minor
          Priority: P1
         Component: druntime
          Assignee: nobody puremagic.com
          Reporter: thomas.bockman gmail.com

Negative one raised to any odd power should yield negative one.

However, when using 80-bit real arithmetic, -1 raised to a power greater than
2^^63 and less than 2^^64 yields +1.

This is despite the fact that integers in this range can still (just barely) be
represented without loss of precision by an 80-bit real; even and odd can still
be distinguished.

** Test case that currently fails **
void main(string[] args)
{
    real b = -1;
    real e = long.max;
    e += 2;
    assert(e % 2 == 1);
    real r = b ^^ e;
    assert(r == 1);  // Passes, but shouldn't
    assert(r == -1); // Fails, but shouldn't

    e = ulong.max;
    assert(e % 2 == 1);
    r = b ^^ e;
    assert(r == 1);  // Passes, but shouldn't
    assert(r == -1); // Fails, but shouldn't
}

I have marked this as a D runtime issue since it fails with all of DMD, GDC,
and LDC. However, I couldn't actually find where the ^^ is defined in my quick
search, so I don't know what the fix should look like. I suppose it might even
be a hardware errata in my FPU (Xeon E3-1225 v3)...

--
Jul 07 2015