• C
    Improve the precision of lerpDouble (#20879) · 784e6d74
    Chris Bracken 提交于
    Reduces errors caused by the loss of floating point precision when the
    two extrema of the lerp differ significantly in magnitude. Previously,
    we used the calculation:
    
        a + (b - a) * t
    
    When the difference in magnitude between `a` and `b` exceeds the
    precision representable by double-precision floating point math, `b - a`
    results in the larger-magnitude value of `a` or `b`. The error between
    the value produced and the correct value is then scaled by t.
    
    A simple example of the impact can be seen when `a` is significantly
    larger in magnitude than `b`. In that case, `b - a` results in `a` and
    when `t` is 1.0, the resulting value is `a - (a) * 1.0 == 0`.
    
    The patch transforms the computation to the mathematically-equivalent
    expression:
    
        a * (1.0 - t) + b * t
    
    By scaling each value independently, the behaviour is more accurate.
    From the point of view of performance, this adds an extra
    multiplication, but multiplication is relatively cheap and the behaviour
    is significantly better.
    
    This patch also adds a `precisionErrorTolerance` constant to
    test_utils.dart and migrates existing tests to use `closeTo()` for
    testing.
    
    The tests themselves *do* currently use values that have an exact
    floating-point representation, but we should allow for flexibility in
    future implementation changes.
    784e6d74
lerp.dart 1.6 KB