LaG*_*tte 7 python numpy rounding
让我们看一下令人震惊的圆形声明:
>>> round(2.675, 2)
2.67
Run Code Online (Sandbox Code Playgroud)
我知道为什么围绕"失败"; 这是因为2.675的二进制表示:
>>> import decimal
>>> decimal.Decimal(2.675)
Decimal('2.67499999999999982236431605997495353221893310546875')
Run Code Online (Sandbox Code Playgroud)
我不明白的是:为什么NumPy不会失败?
>>> import numpy
>>> numpy.round(2.675, 2)
2.6800000000000002
Run Code Online (Sandbox Code Playgroud)
不要介意额外的零; 这是Python打印内部四舍五入的人工制品.如果我们看一下"确切"值,它们仍然是不同的:
>>> decimal.Decimal(round(2.675, 2))
Decimal('2.6699999999999999289457264239899814128875732421875')
>>> decimal.Decimal(numpy.round(2.675, 2))
Decimal('2.680000000000000159872115546022541821002960205078125')
Run Code Online (Sandbox Code Playgroud)
为什么NumPy表现为何?
我一开始认为NumPy必须使用额外的位来处理浮点数,但是:
>>> decimal.Decimal(numpy.float(2.675))
Decimal('2.67499999999999982236431605997495353221893310546875')
>>> decimal.Decimal(2.675)
Decimal('2.67499999999999982236431605997495353221893310546875')
# Twins!
Run Code Online (Sandbox Code Playgroud)
窗帘背后发生了什么?我看了一下NumPy的圆形实现,但我是一个Python新手,我没有看到任何过于腥的东西.
记录了引擎盖差异之上的一个:
如果您在数字中间,则np.round
舍入到最接近的“偶数”数(在乘以10**n
wheren
是相应round
函数的第二个参数之后),而内置round
函数则从 0舍入。
>>> np.round(2.685, 2)
2.6800000000000002
>>> round(2.685, 2)
2.69
Run Code Online (Sandbox Code Playgroud)
在幕后,您可以在使用缩放参数时获得差异。考虑之间的差异round(2.675 * 10.**2)
和round(2.675, 2)
。这当然是浮点数学的结果,它总是有一些与之相关的舍入误差。为了更进一步,我们真的需要看看真正的实现。
归档时间: |
|
查看次数: |
1972 次 |
最近记录: |