Стандартная библиотека - более высокая точность с плавающей точкой? - PullRequest
4 голосов
/ 28 ноября 2009

Итак, у меня есть некоторые проблемы с точностью в Python.

Я бы хотел вычислить такие функции:

P(x,y) = exp(-x)/(exp(-x) + exp(-y))

Где x и y могут быть> 1000. В mathon.exp (-1000) Python (по крайней мере, в версии 2.6!) Недостаточно точности с плавающей запятой, чтобы справиться с этим.

  1. эта форма выглядит как logistic / logit / log-odds, но это не так, верно? Есть ли здесь какое-то алгебраическое упрощение, которое мне не хватает?
  2. Я знаю о десятичной дроби, но не уверен, применимо ли это здесь
  3. выглядит как домашнее задание, но это не так, я обещаю!

(Кроме того, я открыт для названий! Я не мог придумать подходящий для этого вопроса!)

Ответы [ 4 ]

8 голосов
/ 28 ноября 2009
>>> import decimal
>>> decimal.Decimal(-1000).exp()
Decimal('5.075958897549456765291809480E-435')
>>> decimal.getcontext().prec = 60
>>> decimal.Decimal(-1000).exp()
Decimal('5.07595889754945676529180947957433691930559928289283736183239E-435')
8 голосов
/ 28 ноября 2009

вы можете разделить верх и низ на exp(-x)

P(x,y) = 1/(1 + exp(x-y))
4 голосов
/ 28 ноября 2009
P(x,y) = exp(-x)/(exp(-x) + exp(-y))

эквивалентно:

P(x,y) = 1 / (1 + exp(x-y))

Возможно, второй работает без использования большей точности.

3 голосов
/ 28 ноября 2009

Я думаю, вы ищете пакет bigfloat для надежной арифметики с плавающей точкой произвольной точности.

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