除了NumPy和SciPy之外,还需要一个用于数字和科学计算的python模块

Bor*_* L. -6 python precision matlab numpy rounding

简单的操作,例如舍入数字,创建增加的向量等,在python中无法可靠地完成(参见下面的示例).python社区给出的常见解释是浮点精度.

Python 2.7.11 (default, Sep 29 2016, 13:33:00) 
[GCC 5.3.1 20160406 (Red Hat 5.3.1-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.round(2.5)
2.0
>>> numpy.round(3.5)
4.0
>>> numpy.arange(89,90,0.1)
array([ 89. ,  89.1,  89.2,  89.3,  89.4,  89.5,  89.6,  89.7,  89.8,  89.9])
>>> numpy.arange(89+0.1,90,0.1)
array([ 89.1,  89.2,  89.3,  89.4,  89.5,  89.6,  89.7,  89.8,  89.9,  90. ])
>>> numpy.arange(19,20,0.1)
array([ 19. ,  19.1,  19.2,  19.3,  19.4,  19.5,  19.6,  19.7,  19.8,  19.9])
>>> numpy.arange(19+0.1,20,0.1)
array([ 19.1,  19.2,  19.3,  19.4,  19.5,  19.6,  19.7,  19.8,  19.9])
>>> 
Run Code Online (Sandbox Code Playgroud)

但是,现有的工具,如Matlab和Octave,不会受到这种浮点精度现象的影响(参见下面的例子).这些工具也可以作为python使用二进制体系结构,并且仍然能够进行真正的教科书数学运算.

>> round(2.5)
ans =  3
>> round(3.5)
ans =  4
>> [89:0.1:90]
ans =

   89.000   89.100   89.200   89.300   89.400   89.500   89.600   89.700   89.800   89.900   90.000

>> [89+0.1:0.1:90]
ans =

   89.100   89.200   89.300   89.400   89.500   89.600   89.700   89.800   89.900   90.000

>> [19:0.1:20]
ans =

   19.000   19.100   19.200   19.300   19.400   19.500   19.600   19.700   19.800   19.900   20.000

>> [19+0.1:0.1:20]
ans =

   19.100   19.200   19.300   19.400   19.500   19.600   19.700   19.800   19.900   20.000

>>
Run Code Online (Sandbox Code Playgroud)

我已经round为python 编写了自己的操作.我即将range为python 编写自己的操作,谁知道将来还有什么...

我的问题是: 在为python编写全新的数学模块之前,是否可能存在这样的模块? (我的意思是一个能够做真正值得信赖的教科书数学的模块)

The*_*Cat 7

在您展示的示例中,与MATLAB相比,numpy的行为没有什么不可靠,您展示的任何示例都与浮点问题无关(有一个例外).

对于舍入行为,MATLAB在这里做错了.Numpy遵循IEEE四舍五入标准.当十进制值为时,标准要求舍入到最接近的偶数.5.这有一个很好的理由:MATLAB的舍入行为在统计上有偏差,产生的值高于随机数的较低值.

对于该arange函数,Numpy遵循半开间隔约定,该约定排除范围中的最后一个值,而MATLAB遵循闭包间隔约定,其包括最后一个值.无论是对还是错,都有其优点和缺点,但Numpy的行为与绝大多数编程语言一致.

如果要使用闭合间隔,可以使用该linspace功能,该功能可让您控制是否包含最后一个值(默认情况下包括最后一个值).如果你真的需要使用范围功能,很容易在最后添加一个值,或者创建自己的包装函数.

至于浮点问题,MATLAB和numpy完全相同.两者都使用相同的IEEE标准浮点数(除非MATLAB违反标准的舍入规则).但是,Python支持真正的十进制数分数,而MATLAB却没有,因此至少可以在Python中避免这些问题,而不是在MATLAB中.

唯一的例外是这个操作:numpy.arange(89+0.1,90,0.1).您显示的结果确实是一个浮点问题.正如我所说,像MATLAB和numpy这样的浮点问题.这个特殊的例子出现在numpy但不是MATLAB中,但还有其他的例子出现在MATLAB中但不是numpy.

对于范围,numpy在这种情况下非常简单地执行算术:它将步长添加到起始值,然后将其再次添加到该值,依此类推.这意味着这些问题以一种非常可预测的方式发生.MATLAB显然试图变得更聪明,但这意味着它以更加模糊和难以预测的方式失败(我无法找到有关MATLAB如何进行此计算的文档).对于MATLAB和numpy,你真的应该使用linspace这些范围,因为它没有这些类型的问题.

  • 四舍五入的规则很多,而不仅仅是一个.IEEE通过其可选择的舍入模式实现了大部分功能.您正在寻找的一条规则是向学童教授的规则.IEEE和numpy默认的是科学家,工程师和统计学家首选的那个. (3认同)
  • @BorisL.正如我解释的那样,这些规则有充分的理由.它被认为是一种更好的方法,因为它在统计上是无偏见的.通常,处理随机数的人不希望他们的'round`函数改变你的数字的分布.使用早于IEEE的舍入规则是因为它避免了这个问题.例如,请参阅有关该主题的维基百科文章:https://en.wikipedia.org/wiki/Rounding#Round_half_up (2认同)
  • @BorisL.您可以计算步骤数,也可以处理浮点问题.numpy和MATLAB都是如此.至少对于numpy`linspace`来说,端点和步数保持一致,而`arange`(尽可能最好)保持步长一致.在MATLAB中,`linspace`保持端点和步数一致,而范围可以根据明显未记录的规则执行一个或另一个. (2认同)