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编写全新的数学模块之前,是否可能存在这样的模块? (我的意思是一个能够做真正值得信赖的教科书数学的模块)
在您展示的示例中,与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这些范围,因为它没有这些类型的问题.