Floating point differences at compile-time

Don nospam at nospam.com
Fri Jan 1 02:10:53 PST 2010


bearophile wrote:
> I don't understand where the result differences come from in this code:
> 
> import std.math: sqrt, PI;
> import std.stdio: writefln;
> 
> void main() {
>   const double x1 = 3.0 * PI / 16.0;
>   writefln("%.17f", sqrt(1.0 / x1));
> 
>   double x2 = 3.0 * PI / 16.0;
>   writefln("%.17f", sqrt(1.0 / x2));
> 
>   real x3 = 3.0 * PI / 16.0;
>   writefln("%.17f", sqrt(1.0 / x3));
> 
>   real x4 = 3.0L * PI / 16.0L;
>   writefln("%.17f", sqrt(1.0L / x4));
> }

This is caused by compile-time constant folding being done at higher 
precision than at run time; and compile-time doubles and floats are 
actually stored at real precision.

If you change 'const double' into 'enum double' for D2, the values for 
D1 and D2 will match.

But I agree, we ought to do better than this.



> 
> Output with various D compilers:
> 
> DMD1:
> 1.30294003174111994
> 1.30294003174111972
> 1.30294003174111979
> 1.30294003174111979
> 
> DMD2:
> 1.30294003174111972
> 1.30294003174111972
> 1.30294003174111979
> 1.30294003174111979
> 
> LDC:
> 1.30294003174111994
> 1.30294003174111994
> 1.30294003174111972
> 1.30294003174111972
> 
> I'd like the compiler(s) to give more deterministic results here.
> 
> Bye,
> bearophile


More information about the Digitalmars-d-learn mailing list