Thread overview
float has too much precision
Apr 21, 2020
Faux Amis
Apr 21, 2020
Faux Amis
April 21, 2020
I'm dumbfounded, why does the following code write '35' on DMD32 D Compiler v2.091.0-dirty?

module magic;

float magic( float f )
{
    return f + 35f - f;
}

void main()
{
    import std.stdio;
    writeln( magic(1_000_000_000f) );
}
April 21, 2020
On 4/21/20 3:47 PM, Faux Amis wrote:
> I'm dumbfounded, why does the following code write '35' on DMD32 D Compiler v2.091.0-dirty?
> 
> module magic;
> 
> float magic( float f )
> {
>      return f + 35f - f;
> }
> 
> void main()
> {
>      import std.stdio;
>      writeln( magic(1_000_000_000f) );
> }

On run.dlang.io, it prints 64. Also on my mac.

Possibly it's working because intermediate floating point calculations are generally done at max precision. On your system, that might be 80-bit reals.

Also possible that some optimization is figuring out that it can just return 35f?

Try instead:

float magic( float f)
{
   float result = f + 35f;
   return result - f;
}

Is it worth worrying about? floating point is supposed to be inexact and subject to variance on different machines.

-Steve
April 21, 2020
On 2020-04-21 22:10, Steven Schveighoffer wrote:
> On 4/21/20 3:47 PM, Faux Amis wrote:
>> I'm dumbfounded, why does the following code write '35' on DMD32 D Compiler v2.091.0-dirty?
>>
>> module magic;
>>
>> float magic( float f )
>> {
>>      return f + 35f - f;
>> }
>>
>> void main()
>> {
>>      import std.stdio;
>>      writeln( magic(1_000_000_000f) );
>> }
> 
> On run.dlang.io, it prints 64. Also on my mac.
> 
> Possibly it's working because intermediate floating point calculations are generally done at max precision. On your system, that might be 80-bit reals.
> 
> Also possible that some optimization is figuring out that it can just return 35f?
> 
> Try instead:
> 
> float magic( float f)
> {
>     float result = f + 35f;
>     return result - f;
> }
> 
> Is it worth worrying about? floating point is supposed to be inexact and subject to variance on different machines.
> 
> -Steve

No, it doesn't matter. I just wanted to understand why it happened.
It seems splitting it up did the trick. So intermediate it is.

Thanks!