2009-11-27 27 views
4

所以,我在Python中遇到了一些精度问题。标准库 - 更高精度的浮点数?

我想计算这样的功能:

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

其中X和Y可能是> 1000。 Python的math.exp(-1000)(至少在2.6中!)没有足够的浮点精度来处理这个问题。

  1. 这种形式看起来像logistic/logit/log-odds,但它不是,对吧?有没有我在这里错过的代数简化?
  2. 我知道小数,但如果它适用于这里
  3. 看起来像功课我不知道,但它不是,我答应!

(另外,我接受冠军!我想不出一个好这个问题!)

+0

“我知道十进制但我不确定它是否适用于此”?在你试过之后,你不确定什么? –

+2

那么,正如我在下面指出的那样,我没有意识到Decimal()有一个exp方法。做math.exp(Decimal())不起作用。如果你想给我RTFM治疗,那么至少应该链接到TFM。 –

+2

当然math.exp()不会工作;它期望一个浮动。数学模块镜像C数学函数。我不想给你RTFM治疗,我想给你“在CHM文档的索引面板上输入exp,并且列出两个十进制方法,接着是cmath和math函数(或者使用不是那么闪烁的' http://docs.python.org/search.html?q = exp'(十进制exp方法是第7次和第8次命中))“处理和”避免模糊华夫饼像'我知道X,但不知道它是否适用这里''治疗。 –

回答

8

你可以通过exp(-x)

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

,或者对较差的老脑细胞的磨损较小,用'exp(x)':-)乘以顶部和底部 –

+0

虽然这是真的,但这并不能解决问题,因为exp(xy)仍然可以有(xy)> 1000的值。 – steveha

+1

+1使用大脑比肌肉好。 @steveha:x和y的顺序可能相似,这会大大改善情况。 – u0b34a0f6ae

3

我认为你正在寻找bigfloat包任意精度浮点可靠算术。

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

也许第二个作品,未经使用的更精确:

+0

很高兴知道,但不是标准库的一部分。感谢您的链接,但! –

+0

有时候会很痛苦,特别是在Windows下。 –

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

划分顶部和底部是等价的。

+0

我也会接受你的。我不知道为什么我看不到它!谢谢! –

8
>>> import decimal 
>>> decimal.Decimal(-1000).exp() 
Decimal('5.075958897549456765291809480E-435') 
>>> decimal.getcontext().prec = 60 
>>> decimal.Decimal(-1000).exp() 
Decimal('5.07595889754945676529180947957433691930559928289283736183239E-435') 
+2

感谢您演示如何在这里实际使用Decimal。我没有意识到它有'exp'方法。 –