Изменение в поведении для 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
.