Bug?

deed via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Oct 23 11:46:07 PDT 2014


On Thursday, 23 October 2014 at 18:26:53 UTC, Steven 
Schveighoffer wrote:
> On 10/23/14 2:18 PM, deed wrote:
>>> Using equality is not a good idea with floating point.
>>>
>>> The compiler will on a whim, or depending on whether it can 
>>> inline or
>>> not, use higher precision floats, changing the outcome 
>>> slightly.
>>>
>>> I cannot say for certain whether this explains all the issues 
>>> you
>>> have, the very last one seems troubling to me at least.
>>>
>>
>> Sure, in many cases it's a bad idea. While I understand that 
>> sin(PI) !=
>> 0.0, but approxEqual(sin(PI), 0.0) == true, I would expect the 
>> following
>> to pass:
>>
>> assert (0.0 == 0.0);
>> assert (1.2345 == 1.2345);
>> F a = 1.2345, b = 9.8765;
>>
>> assert (a+b == b+a);
>> assert (a*b == b*a);
>
> None of these fail on my system

Same for me, that's the point; it's perfectly valid to compare 
floating points.

>
>> F fun (F a) pure;
>>
>> assert (fun(a) + fun(b) == fun(b) + fun(a));
>> assert (fun(a) * fun(b) == fun(b) * fun(a));
>>
>> auto a = fun(100);
>> auto b = fun(100);
>>
>> assert (a == b);
>> assert (fun(100) == fun(100));
>>
>
> Not sure what body of fun is, so I cannot test this.

Could be anything taking a floating point and returning a 
floating point.
You would expect to get the same back for the same input, 
especially when
it's pure. If so, the asserts above are expected to hold.


>> Now, if fun's body is { return sin(a); }, the behaviour 
>> changes to:
>>
>> auto c = fun(100);
>> auto d = fun(100);
>>
>> assert (c == d);              // Ok
>> assert (fun(100) != fun(100)) // I have a hard time 
>> understanding
>>                               // this is correct behaviour
>
> Tried that out, it does not fail on my machine. Can you be more 
> specific on your testing? What compiler/platform? Stock 
> compiler, or did you build it yourself?

Right. It doesn't fail, and that's the problem.

assert (fun(100) == fun(100));  // Should pass, and does with
                                 // body { return a + 1; }
                                 // but not with
                                 // body { return sin(a); }
assert (fun(100) != fun(100));  // Shouldn't pass, but passes with
                                 // body { return sin(a);}

Compiler: DMD32 D Compiler v2.066.0

Also tried dpaste.dzfl.pl with 2.065.0 and DMD 2.x Git 
(cfb5842b49),
which had slightly different behaviour; more of the sin tests 
which should
pass in my opinion did with those two. Hence, it appears to be 
regressions.

>
> -Steve



More information about the Digitalmars-d-learn mailing list