Мой вопрос: какие еще
общие ситуации, которые я должен искать
и то, что считается «хорошим»
методы приближения к ним?
Существует несколько способов серьезной или даже катастрофической потери точности.
Наиболее важной причиной является то, что числа с плавающей запятой имеют ограниченное количество цифр, например, двойные имеют 53 бита. Это означает, что если у вас есть «бесполезные» цифры, которые не являются частью решения, но должны быть сохранены, вы теряете точность.
Например (Мы используем десятичные типы для демонстрации):
2.598765000000000000000000000100 -
2,598765000000000000000000000099
Интересная часть - ответ 100-99 = 1. Так как 2.598765 в обоих случаях равен
не меняет результат, но тратит 8 цифр. Гораздо хуже, потому что компьютер не
знаю, что цифры бесполезны, они вынуждены хранить их и забивают 21 ноль после них,
тратить на все 29 цифр. К сожалению, нет способа обойти это из-за различий,
но есть и другие случаи, например exp (x) -1 - функция, очень часто встречающаяся в физике.
Функция exp около 0 является почти линейной, но она вводит 1 как начальную цифру. Так с 12
значащие цифры
exp (0.001) -1 = 1.00100050017 - 1 = 1.00050017e-3
Если вместо этого мы используем функцию expm1 (), используйте ряд Тейлора:
1 + х + х ^ 2/2 + х ^ 3/6 ... -1 =
x + x ^ 2/2 + x ^ 3/6 =: expm1 (x)
expm1 (0,001) = 1,00500166667e-3
Намного лучше.
Вторая проблема - это функции с очень крутым наклоном, например, тангенсом x около pi / 2.
tan (11) имеет наклон 50000, что означает, что любое небольшое отклонение вызвано ошибками округления
до того будет увеличен в 50000 раз! Или у вас есть особенности, если, например, результат приближается к 0/0, это означает, что он может иметь любое значение.
В обоих случаях вы создаете замещающую функцию, упрощая исходную функцию. Бесполезно выделять различные подходы к решению, потому что без обучения вы просто не увидите проблему в первую очередь.
Очень хорошая книга для изучения и обучения: Форман С. Актон: Реальные вычисления сделали реальностью