Hello. I found unexpected (for me) behavior of rounding double values at casting to ulong:

$ cat roundtest.d
import std.stdio;

void main()
{
    double a = 10, b = 0.01;

    writeln( "int:   ", cast(int)(a/b) );
    writeln( "uint:  ", cast(uint)(a/b) );
    writeln( "long:  ", cast(long)(a/b) );
    writeln( "ulong: ", cast(ulong)(a/b) );
}

$ rdmd roundtest.d
int:   1000
uint:  1000
long:  1000
ulong: 999   <----- WTF?? -------

$ dmd --version
DMD64 D Compiler v2.067.1
Copyright (c) 1999-2014 by Digital Mars written by Walter Bright

$ ldc2 roundtest.d && ./roundtest
int:   1000
uint:  1000
long:  1000
ulong: 1000  <------- Ok --------

$ ldc2 --version
LDC - the LLVM D compiler (0.15.2-beta1):
  based on DMD v2.066.1 and LLVM 3.6.0
  Default target: x86_64-unknown-linux-gnu
  Host CPU: core-avx-i
  http://dlang.org - http://wiki.dlang.org/LDC

  Registered Targets:
    x86    - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64

$ uname -a
Linux lenovo 4.0.4-201.fc21.x86_64 #1 SMP Thu May 21 15:58:47 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

have it behavior explain? can I use casting in dmd for rounding values or it not safe?

Reply via email to