writeln double precision

Ali Çehreli acehreli at yahoo.com
Mon Oct 23 18:08:43 UTC 2017


On 10/23/2017 07:22 AM, Arun Chandrasekaran wrote:
 > void main() {
 >      double a = 22/7.0;
 >      import std.stdio: writeln, writefln;
 >      writefln("%.51f", a);
 > }

 > But why does the compiler bring the C baggage for the integer
 > division? Why do I need to `cast (double)` ?

I think you mean having to write 7.0 to bring a double into the expression.

 > Can't the compiler figure
 > it out?

Yes, it can but we don't want that. Otherwise, the code would be too 
slippery to keep under control. For example, introducing the following 
temporary variable would change the semantics:

   // Before:
   foo(22/7);

   // After
   double temp = 22/7;
   foo(temp);    // Is this the same call with the same value?

Writing the above made me aware that function overloading would be too 
cumbersome as the compiler would find too many potential matches for the 
expressions. For example, should it convert 22/7 to float or double or 
long, etc.

The rule is that every expression has a type and 22/7 is int. The rules 
are carried from C and can be tricky. Both "Integer Promotions" and 
"Usual Arithmetic Conversion" are interesting here:

   https://dlang.org/spec/type.html#integer-promotions

Ali



More information about the Digitalmars-d-learn mailing list