Calculation differences between Debug and Release mode

Simen Kjaeraas simen.kjaras at gmail.com
Sat Apr 20 05:30:03 PDT 2013


On Sat, 13 Apr 2013 18:36:21 +0200, Jeremy DeHaan  
<dehaan.jeremiah at gmail.com> wrote:

> I'm on Windows, and I my compilation was nothing more than "dmd -O  
> -release main.d" to get the issue I described.

Turns out, the problem starts here:

     static const(float) pi = 3.141592654f;

If we compare that to std.math.PI, we see that they're different:

     >> writeln( 3.141592654f - std.math.PI );
     4.10207e-10

If, however, we assign these values to some temporary floats, we see that
they're equal:

     >> float a = 3.141592654f;
     >> float b = std.math.PI;
     >> writeln( a - b );
     0

Replace float with double or real in the above, and the difference  
reappears.

So, we have established that 3.141592654f is a valid approximation to pi  
for a
float. The problem thus has to be one of precision. I'm not sure if it's a  
valid
optimization for the compiler to use doubles instead of floats (it  
certainly
seem innocuous enough). I'd say file a bug on it. Worst case, it gets  
closed as
invalid.

-- 
Simen


More information about the Digitalmars-d-learn mailing list