我正在将MATLAB代码移植到Python 3.5.1,但发现了浮点取整问题。
在MATLAB中,下面的数字将被四舍五入最多到第6位小数:
fprintf(1,'%f', -67.6640625);
-67.664063
在Python,而另一方面,下面的数字将被四舍五入掉至第6位小数:
print('%f' % -67.6640625)
-67.664062
有趣的是,如果该号码是“-67.6000625”,则取整起来,即使在Python:
print('%f' % -67.6000625)
-67.600063
...为什么会发生这种情况?在Python中四舍五入/四舍五入的条件是什么?(我认为这与处理十六进制值有关。)
更重要的是,如何防止这种差异?我应该创建一个Python代码,该代码可以重现与MATLAB产生的输出完全相同的输出。
python行为的原因与浮点数如何存储在计算机中以及IEEE定义的标准化舍入规则有关,IEEE定义了几乎所有现代计算机上使用的标准数字格式和数学运算。
由于需要在计算机上以二进制有效地存储数字,导致计算机使用浮点数。这些数字易于处理器使用,但是具有无法精确表示许多十进制数字的缺点。这导致数字有时与我们认为应该的数字有些出入。
如果我们使用Python扩展值而不是将其截断,情况就会变得更加清晰:
>>> print('%.20f' % -67.6640625)
-67.66406250000000000000
>>> print('%.20f' % -67.6000625)
-67.60006250000000704858
正如您所看到的,-67.6640625
是一个可以精确表示的数字,但-67.6000625
实际上不是更大。IEEE标准标准为浮点数定义的默认舍入模式表示,上面的任何内容5
都应四舍五入,下面的任何内容都应四舍五入。因此,对于的情况-67.6000625
,实际上是5
加上少量,因此将其四舍五入。但是,对于-67.6640625
,它等于5,因此抢七规则开始起作用。默认的决胜规则是四舍五入到最接近的偶数。由于2
是最近的事件编号,因此将其舍入为两位。
因此,Python遵循浮点标准推荐的方法。那么问题来了,为什么您的MATLAB版本不这样做呢?我在使用64位MATLAB R2016a的计算机上进行了尝试,并且得到了与Python相同的结果:
>> fprintf(1,'%f', -67.6640625)
-67.664062>>
因此,似乎MATLAB在某些时候使用了不同的舍入方法(也许是非标准方法,也许是标准中指定的替代方法之一),并且此后切换为遵循与其他所有人相同的规则。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句