
Баг: Вычитание близких чисел (катастрофическая потеря точности)
Что делают:
Вычитают 1.0000000000000002 - 1.0000000000000001 и ожидают 0.0000000000000001, но получают 1.1102230246251565e-16 – "мусор".
Почему ошибка:
При вычитании почти равных чисел старшие разряды уничтожаются, и остаётся только шум округления, который был в младших битах.
Как правильно:
По возможности переписывать формулу, чтобы избежать вычитания близких чисел.
Использовать
math-функции, которые реализуют устойчивые алгоритмы (например,math.Hypotвместоsqrt(a*a + b*b)).
Загрузка...