Численная точность в простых финансовых вычислениях

Я прошел курс в университете, где объяснялось, как (среди прочего) упорядочить математическое выполнение, чтобы максимизировать точность и снизить риск ошибок округления в среде с конечной точностью.

Мы работаем над финансовой системой с вашим обычным расчетом процентов и тому подобным. Может кто-нибудь поделиться/напомнить мне, как структурировать ваши расчеты, чтобы свести к минимуму потерю точности?

Я знаю, что, например, следует избегать разделения. Кроме того, при делении сначала следует разделить наибольшее число, если это возможно.


person Andre Luus    schedule 19.10.2010    source источник
comment
Да, я согласен, я должен сделать это тоже.   -  person Andre Luus    schedule 19.10.2010


Ответы (4)


Главное правило численных вычислений — избегать вычитания почти равных чисел. Умножение и деление всегда точны: вы теряете не более одного бита точности при выполнении умножения или деления. Но если два числа совпадают в 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 здесь .

Если вас беспокоит числовая точность, вам необходимо понимать анатомия чисел с плавающей запятой, чтобы знать, что безопасно, а что нет.

person John D. Cook    schedule 19.10.2010
comment
При вычитании, если одно число очень большое, а другое маленькое, результатом будет одно и то же большое число без изменений; и то, что повторяется много раз, тоже может привести к значительному дрейфу. - person fortran; 19.10.2010
comment
Ага! Теперь я вспоминаю приближение Тейлора, используемое в этом контексте. Вы приводите именно те аргументы, которые я искал. У вас нет онлайн-источников, о которых я мог бы продолжить чтение? Я проверю ваш блог в ближайшее время. - person Andre Luus; 19.10.2010
comment
Помимо ссылок в моем ответе, вы можете посмотреть johndcook.com/blog/2010/07/27/sine-approimation-for-small-x. В частности, речь идет о синусоидальных функциях, но в более общем плане речь идет о приближениях Тейлора, относительной ошибке и т. Д. - person John D. Cook; 19.10.2010

Используйте суммы в центах, а не в долларах.

person lhf    schedule 19.10.2010

Потеря точности обычно связана с использованием двоичных представлений с плавающей запятой. Финансовая система не должна использовать такие представления и вместо этого использовать числа произвольной точности (например, BigDecimal в Java и decimal в .NET). Это должно быть вашим первым шагом.

person Dr. Snoopy    schedule 19.10.2010

Существует также возможность использовать интервальную арифметику.

person Ronny Brendel    schedule 19.10.2010