Численная точность в простых финансовых вычислениях - PullRequest
1 голос
/ 19 октября 2010

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

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

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

Ответы [ 4 ]

5 голосов
/ 19 октября 2010

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

5 голосов
/ 19 октября 2010

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

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

3 голосов
/ 19 октября 2010

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

0 голосов
/ 19 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...