首先,我不是一个数学家,所以大量的精度很少过滤到我的日常工作中。请温柔。 )Python 32/64位机器浮点移位矩阵求和不正确?
使用NumPy的,以产生具有从值1相等地划分的矩阵:
>>> m = numpy.matrix([(1.0/1000) for x in xrange(1000)]).T
>>> m
matrix[[ 0.001 ],
[ 0.001 ],
...
[ 0.001 ]])
在64位的Windows与Python 2.6,求和很少工程以1.0。 math.fsum()对这个矩阵有影响,但如果我改变矩阵使用更小的数字,则不会。
>>> numpy.sum(m)
1.0000000000000007
>>> math.fsum(m)
1.0
>>> sum(m)
matrix([[ 1.]])
>>> float(sum(m))
1.0000000000000007
在带有Python 2.6的32位Linux(Ubuntu)上,求和总是可以达到1.0。
>>> numpy.sum(m)
1.0
>>> math.fsum(m)
1.0
>>> sum(m)
matrix([[ 1.]])
>>> float(sum(m))
1.0000000000000007
我可以评估时的埃普西隆添加到我的代码,如果矩阵款项1(例如-epsilon <总和(M)< +小量),但我想先了解一下该差异的原因是内Python,以及是否有更好的方法来正确确定总和。
我的理解是,总和正在处理数字(浮点数)的机器表示方式与它们的显示方式不同,并且在求和时使用内部表达式。但是,看看我用来计算总和的3种方法,不清楚它们为什么不同,或者平台之间是相同的。
什么是正确计算矩阵总和的最佳方法?
如果你正在寻找一个更有趣的矩阵,这个简单的变化将有较小的矩阵编号:
>>> m = numpy.matrix([(1.0/999) for x in xrange(999)]).T
在此先感谢您的帮助!
更新 我想我想出了一些东西。如果我将存储的值更正为32位浮点值,则结果与32位Linux求和值相匹配。
>>> m = numpy.matrix([(numpy.float32(1.0)/1000) for x in xrange(1000)]).T
>>> m
matrix[[ 0.001 ],
[ 0.001 ],
...
[ 0.001 ]])
>>> numpy.sum(m)
1.0
这将设置矩阵机数来表示在我的Windows测试32位浮点,不64位,并且将正确总结。为什么0.001浮点数不等于32位和64位系统上的机器编号?如果我试图存储具有许多小数位的非常小的数字,我希望它们会有所不同。
有没有人对此有任何想法?在这种情况下,我应该明确地切换到32位浮点数,还是有64位求和方法?或者我回到添加一个epsilon?对不起,如果我听起来很愚蠢,我对意见很感兴趣。谢谢!
您*必须*使用ε,因为你必须永远* *比较浮点数的确切平等。 *特别*你知道的数字是算术的结果,而不是例如。常量或配置值,例如。 – unwind 2012-01-12 16:55:52
@unwind:永远不要说永远。精确的相等测试有时在浮点上是合适和必要的。但是,这不是其中之一。 – 2012-01-12 16:57:46
您可能想了解[浮点数](http://en.wikipedia.org/wiki/Floating_point)是如何工作的。知道什么时候做什么是很有用的。 – murgatroid99 2012-01-12 17:03:22