1. 03 9月, 2020 6 次提交
  2. 02 9月, 2020 15 次提交
  3. 01 9月, 2020 15 次提交
  4. 31 8月, 2020 4 次提交
    • S
    • S
    • S
    • 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