python的精确和与点积
accup的Python项目详细描述
python的精确和(点)产品。
总和
如果列表中的值是浮点值,则汇总列表中的值可能会很困难 数字;可能会发生数字相消,结果可能会出错。一个 典型的例子是和
1.0e16 + 1.0 - 1.0e16
实际结果是1.0
,但在双精度中,这将导致0.0
。
虽然在这个例子中失败是显而易见的,但它可以得到更多
比这更狡猾。Accupy提供
p,exact,cond=accupy.generate_ill_conditioned_sum(100,1.0e20)
给定长度和目标条件数,将生成 很难总结的浮点数。
AccuPy有以下求和方法:
accupy.kahan_sum(p)
:Kahan summationaccupy.fsum(p)
:矢量化包装 math.fsum(其中 使用shewchuck的算法[1](另请参见 here)。accupy.ksum(p, K=2)
:k倍精度求和(来自[2])
所有求和方法对多维numpy数组的第一维求和。
我们来比较一下。
精度比较(总和)
正如所料,天真的
sum表现非常糟糕
有病态的总和;同样地
^{
在accupy.ksum
中以2倍精度计算和给出了正确的
如果条件至多在机器精度范围内,则结果;进一步
增加K
有助于改善状况。
shewchuck在math.fsum
中的算法总是给出正确的结果
浮点精度。
运行时比较(总和)
我们比较越来越多的固定大小的和(上面)和越来越大的和,
但有固定的数量。在这两种情况下,最不准确的方法是
最快(numpy.sum
),最准确最慢(accupy.fsum
)。
点产品
Accupy对点产品有以下方法:
我们来比较一下。
精度比较(点)
Accupy可以使用
x,y,exact,cond=accupy.generate_ill_conditioned_dot_product(100,1.0e20)
并对不同方法的精度进行了比较。
关于和,numpy.dot
是最不精确的,其次是kdot
的实例。
fdot
可证明精确到最后一位
运行时比较(dot)
numpy的numpy.dot
比accupy提供的所有替代方案都快。
这是因为截断错误的簿记需要更多的步骤,但是
主要是因为numpy高度优化的dot实现。
参考文献
依赖性
AcCuPy需要提供的C++ Eigen
library
debian/ubuntu作者
^{
安装
accupy是available from the Python Package Index,所以使用
pip install -U accupy
您可以安装/升级。
测试
要运行测试,只需签出此存储库并键入
MPLBACKEND=Agg pytest
许可证
accupy发布在MIT license下。