Я пытаюсь рассчитать следующее соотношение: w(i) / (sum(w(j))
, где w
обновляются с использованием функции экспоненциального убывания, т.е. w(i) = w(i) * exp(-k)
, k
являются положительными параметрами. Все числа неотрицательны. Затем это отношение используется в формуле (умножить на константу и добавить другую константу). Как и ожидалось, вскоре я столкнулся с проблемами недополнения.
Я думаю, это происходит часто, но может ли кто-нибудь дать мне несколько ссылок о том, как с этим бороться? Я не нашел подходящего преобразования, поэтому одну вещь, которую я попытался сделать, это установить минимальное положительное число в качестве порога безопасности, но мне не удалось найти минимальное положительное число с плавающей запятой (я представляю числа в numpy.float128
). Как я могу получить минимальное положительное такое число на моей машине? Код выглядит следующим образом:
w = np.ones(n, dtype='float128')
lt = np.ones(n)
for t in range(T):
p = (1-k) * w / w.sum() + (k/n)
# Process a subset of the n elements, call it set I, j is some range()
for i in I:
s = p[list(j[i])].sum()
lt /= s
w[s] *= np.exp(-k * lt)
где k — некоторая константа в (0,1), а n — длина массива
numpy.float128
— очень вводящее в заблуждение имя — его реальная точность такая же, как и у вашего компилятора C, который называетсяlong double
, что составляет 80 бит на x86 (для ясности вместо этого рекомендуется использовать псевдонимnumpy.longdouble
). Чтобы получить наименьшее представимое положительное число с плавающей запятой, вы можете использоватьnp.finfo(numpy.float128).tiny
который на моей машине равен3.3621031431120935063e-4932
, но более полезным порогом, вероятно, будет машинный эпсилон (eps
). - person ali_m   schedule 30.10.2015