On Thu, 27 Apr 2023 10:11:42 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:
> Region has floor and ceiling functions that ensure that calling them twice in > a row will yield the same result: > > ceil(x) = ceil(ceil(x)) > > However, due to use of a constant `EPSILON` which is added/subtracted before > doing the rounding, this only works for small numbers (in the range of 0-50 > approximately). For larger values and scales, rounding errors can easily > occur. This is visible as artifacts on screen where controls are a pixel > wider than they should be. > > The use of the `EPSILON` constant is incorrect, as its value depends on the > magnitude of the value in question (as magnitude increases, the fractional > precision decreases). > > The Math class offers the function `ulp` that should be used here. It > represents the smallest possible change in value for a given double. > > Extending the existing test case `snappingASnappedValueGivesTheSameValueTest` > to use larger magnitude numbers exposes the problems. At first glance, this fix looks correct to me. We'll want to do a reasonable amount of testing. @andy-goryachev-oracle can you also review this? ------------- PR Comment: https://git.openjdk.org/jfx/pull/1118#issuecomment-1525543877 PR Comment: https://git.openjdk.org/jfx/pull/1118#issuecomment-1525544287