Расчет с плавающей точкой - PullRequest
       17

Расчет с плавающей точкой

2 голосов
/ 20 февраля 2012

Извинения за неоднозначное название.Моя проблема заключается в следующем: заданный вектор удваивается w с записями меньше единицы, второй вектор удваивается v с положительными значениями, сумма которых меньше единицы (вычисляется с помощью рекурсии ниже), и удваивается uкоторый положителен и меньше единицы, увеличьте v с помощью рекурсии

w(i) = RandomNumber(); //A random number from (0,1) - not necessarily uniform
v(i) = v(i-1)*w(i)*(1-w(i-1))/w(i-1);

до sum(v)>1-u.Проблема в том, что u может быть довольно маленьким, и поскольку v(i) (стохастически) уменьшаются, они тоже могут стать крошечными.И мы можем приблизиться к w(i) к единице.

Какой самый безопасный способ реализовать это?Очки за точность:)

Ответы [ 2 ]

0 голосов
/ 20 февраля 2012

Может быть, вместо того, чтобы накапливать v (i) и сравнивать его с 1-u, вы начинаете с 1-u и уменьшаете каждое v (i), пока не получите отрицательное число?Точность тем лучше, чем ближе к 0.

0 голосов
/ 20 февраля 2012

Один из распространенных способов суммирования чисел с плавающей запятой без особых ошибок - это суммирование их от наименьшего к наибольшему. Поскольку ваше вычисление v(i) зависит только от v(i-1), вы можете сохранить прошлые числа в отсортированном дереве с рекурсивными суммами, хранящимися в каждом узле, и непосредственно предшествующим значением в отдельной переменной. Когда вы вставляете новое значение или переставляете какой-то узел, вам необходимо пересчитать суммы, идущие вверх по дереву из этих точек. Суммирование в каждом узле может быть прямым сложением или чем-то, что сохраняет еще несколько битов, таких как суммирование Кахана.

...