Поделиться через


Изменение в поведении для Vector2.Lerp и Vector4.Lerp

Изменена реализация Vector2.Lerp(Vector2, Vector2, Single) и Vector4.Lerp(Vector4, Vector4, Single), чтобы корректно учитывать ошибку округления чисел с плавающей запятой.

Описание изменения

Ранее Vector2.Lerp(Vector2, Vector2, Single) и Vector4.Lerp(Vector4, Vector4, Single) были реализованы как value1 + (value2 - value1) * amount. Тем не менее, из-за ошибки округления чисел с плавающей запятой этот алгоритм не всегда возвращает value2, когда amount равно 1.0f.

В .NET 5 и более поздних версий в реализации используется тот же алгоритм, что и в Vector3.Lerp(Vector3, Vector3, Single), то есть (value1 * (1.0f - amount)) + (value2 * amount). В этом алгоритме корректно учитывается ошибка округления. Таким образом, теперь, если amount равно 1.0f, результат будет точно равен value2. Обновленный алгоритм также может быть свободно оптимизирован с использованием MathF.FusedMultiplyAdd (если доступно).

Представленные версии

5,0

Никаких действий не требуется. Если вы хотите сохранить старое поведение, можно реализовать собственную функцию Lerp, которая использует предыдущий алгоритм value1 + (value2 - value1) * amount.

Затронутые API