float has too much precision

Faux Amis faux at amis.com
Tue Apr 21 20:36:08 UTC 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!


More information about the Digitalmars-d-learn mailing list