2011-09-08 63 views
4

我有一个函数fac(n)其返回n!,并且我比较它与伽马(N + 1)转换浮到长在python

>>> from math import gamma 
>>> gamma(101)-fac(100) 
0.0 
>>> math.floor(gamma(101))-fac(100) 
0.0 
>>> long(gamma(101))-fac(100) 
-1716052534060312817912314997891197522637580074354635372754659484313875350886868191008427848256820699487696649234627144617147818134104040275968L 

伽马(101)= 100!并且是一个整数。

为什么结果不同?

回答

6

结果是不同的,因为浮点类型的精度有限,并且由于减法运算符强制它的操作数是相同类型。 gamma函数返回一个浮点数,所以它不能为这个数字返回一个精确的答案。 This page给出了一个很好的问题描述。

gamma(101)-fac(100)fac(100)项在减法运算之前转换为浮点数。

>>> gamma(101) 
9.332621544394415e+157 
>>> float(fac(100)) 
9.332621544394415e+157 

fac(100)(最显著)的一部分,适合在一个浮动匹配的gamma(101),所以在0.0减法结果。

对于你的第二个测试,gamma(101)没有小数部分,从而math.floor没有影响:

>>> math.floor(gamma(101)) == gamma(101) 
True 

当您转换gamma(101)为长,你可以清楚地看到,这是不准确的:

>>> long(gamma(101)) 
933262154439441509656467047959538825784009703731840988 
310128895405822272385704312950661130892883272778258496 
64006524270554535976289719382852181865895959724032L 
>>> fac(100) 
933262154439441526816992388562667004907159682643816214 
685929638952175999932299156089414639761565182862536979 
20827223758251185210916864000000000000000000000000L 
2

浮点数没有无限精度,并将它们转换为long不会给出非常准确的结果。您看到的差异是gamma(101)的浮点表示与其实际整数值之间的差异。

+0

奇怪的不一致尽管使用了'math.floor',理论上它应该和第三个一样。 – rfw

+0

@rfw:'math.floor()'返回一个'float';对于已经存储为浮点数的整数值,它是无操作的。 – geoffspear

+0

奇怪的是,在Python 3中它返回'int'和'math.gamma'在Python 2中不存在。 – rfw