Strange result with nextUp for reals

2014-02-16 Thread Andrej Mitrovic
-
import std.math;
import std.stdio;

void main()
{
writefln(nextUp of %a is %a, 1.0, 1.0.nextUp());

real num = 1.0;
writefln(nextUp of %a is %a, num, num.nextUp());
}
-

This prints:

nextUp of 0x1p+0 is 0x1.1p+0
nextUp of 0x1p+0 is 0x1.0002p+0

Any idea why the results are different?


Re: Strange result with nextUp for reals

2014-02-16 Thread Andrej Mitrovic
On 2/16/14, Andrej Mitrovic andrej.mitrov...@gmail.com wrote:
 Any idea why the results are different?

Interestingly the literal versions end up calling nextUp which takes a
double rather than a real. So nextUp(1.0) calls the double overload,
nextUp(num) calls the real overload. Mystery solved.


Re: Strange result with nextUp for reals

2014-02-16 Thread Ali Çehreli

On 02/16/2014 01:42 PM, Andrej Mitrovic wrote:

 -
 import std.math;
 import std.stdio;

 void main()
 {
  writefln(nextUp of %a is %a, 1.0, 1.0.nextUp());

That line uses doubles.


  real num = 1.0;
  writefln(nextUp of %a is %a, num, num.nextUp());

That one uses reals.

 }
 -

 This prints:

 nextUp of 0x1p+0 is 0x1.1p+0
 nextUp of 0x1p+0 is 0x1.0002p+0

 Any idea why the results are different?

There is no difference. They are both 1. ;)

The type of floating point literals is double. You are seeing the 
precision difference between doubles and reals.


Ali



Re: Strange result with nextUp for reals

2014-02-16 Thread Casper Færgemand

If you swap the line to
writefln(nextUp of %a is %a, 1.0L, 1.0L.nextUp());
you get the same result as the second case.