Основное правило числовых вычислений - избегать вычитания почти равных чисел. Умножение и деление всегда точны: при выполнении умножения или деления вы теряете не более одного бита точности. Но если два числа соответствуют n битам, вы можете потерять до n бит точности при их вычитании.
Существуют всевозможные приемы, позволяющие избежать таких вычитаний. Например, предположим, что вам нужно вычислить exp (x) - 1 для малых значений x. (Это то, что вы могли бы сделать при расчете процентов.) Если x настолько мало, что exp (x) равно 1 для всей точности компьютера, тогда вычитание даст ровно 0, а полученная относительная ошибка будет равна 100%. , Но если вы используете приближение Тейлора exp (x) - 1 = x + x ^ 2/2 + ..., вы можете получить более точный ответ. Например, exp (10 ^ -17) - 1 будет полностью неточным, но 10 ^ -17, одночленное приближение Тейлора, будет очень точным. Вот как работают такие функции, как expm1
. См. Объяснение log1p
и expm1
здесь .
Если вас беспокоит точность чисел, вам необходимо понять анатомию чисел с плавающей запятой , чтобы узнать, что безопасно, а что нет.