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"
