2016-09-03 9:48 GMT+02:00 Nicolas Cellier <
[email protected]>:

> For floating points it would be good to also have something related to
> unit of least precision like I think it exists in google tests:
>
> assert: aFloat isWithin: anInteger ulpFrom: anotherFloat
>     ^(aFloat - anotherFloat) abs <= (anotherFloat ulp max: aFloat ulp)
>
> It's testing if the result are the same with a tolerance on least
> significant bits.
> (anotherFloat ulp max: aFloat ulp) is not really necessary, it's only for
> making the comparison symmetric.
> indeed, 2 and 2 predecessor do not have the same exponent, so do not have
> the same ulp.
> If we don't have symmetry, then
>     self assert: 2.0 predecessor predecessor isWithin: 1 ulpFrom: 2.0.
> might differ from:
>     self assert: 2.0 isWithin: 1 ulpFrom: 2.0 predecessor predecessor .
>
> Note that the this message cannot be used to test for zero result (because
> 0.0 ulp is the smallest denormal).
> For example:
>     self assert: 2.0 - 2.0 predecessor isWithin: 4 ulpFrom: 0.0.
> would anwer false, but it makes no sense!
> One should write
>     self assert: 2.0 isWithin: 4 ulpFrom: 2.0 predecessor.


Bad result will be in other cases too (not only zero):

expected := 8085- 8084.9999.
computed := (80.85 * 100) - 8084.9999.
(computed - expected) abs <= (computed ulp max: expected ulp)    "==> false"

Reply via email to