Python数值计算的关注点

时间:2014-05-07 21:41:16

标签: python python-2.x

我在python中计算了以下2个值并得到了不同的结果!如果有人能够解释为什么会这样发生,那就太好了。

(111 - (111 + 2*17)*3375)/(-14)给出34947作为输出。

(111 - (111 + 2*17)*3375)/(14)*-1给出34948作为输出。

这两个术语在数学上是等价的。

4 个答案:

答案 0 :(得分:5)

这与舍入规则有关。考虑一个更简单的例子:

>>> -3/(-2)
1

>>> -3/2*-1
2

1.5向下舍入为1-1.5向下舍入为-2。在某种程度上是一致的。

Doc reference:

  

普通或长整数除法产生相同类型的整数;该   结果是具有'floor'功能的数学除法   适用于结果。

如果你想在Python 2.x中得到一个浮点结果,你需要一个显式转换(或者只是使用浮点文字),或者做from __future__ import division。在Python 3.x中,除法总是产生一个浮点数(ref)。

答案 1 :(得分:1)

您正在进行整数数学运算,根据分数结果是负数还是正数,对结果进行不同的舍入。使用浮点除法:

>>> (111 - (111 + 2*17)*3375)/(14.)*(-1)
34947.42857142857
>>> (111 - (111 + 2*17)*3375)/(-14.)
34947.42857142857

答案 2 :(得分:1)

归结为python处理整数除法的方式。

如果你的除法的分子(顶部)或除数(底部)是负数,那么python将从零开始舍入。一个简单的说服自己的方法是比较两个更简单的分数:25/625/(-6)。这些将分别产生4和-5。

为了获得相同的结果,你可以使用浮点数,即14.0转换到浮点算术。

如果你对更多的数学感兴趣,这似乎是一篇非常好的文章: http://python-history.blogspot.co.nz/2010/08/why-pythons-integer-division-floors.html

答案 3 :(得分:0)

如前所述,python划分和舍入似乎是个问题 这是如何解决它

In [10]: int((111 - (111 + 2*17)*3375)/(-14.0))
Out[10]: 34947

In [11]: int((111 - (111 + 2*17)*3375)/(14.0)*-1 )
Out[11]: 34947