我看到很少有非浮点计算库/程序包。鉴于浮点表示形式的各种不准确性,提出了一个问题,为什么至少在某些领域中,这种提高的准确性可能值得使用定点运算的复杂性。
使用定点特征值求解器是否有重大困难?他们将有多慢/快,不准确/准确?
我看到很少有非浮点计算库/程序包。鉴于浮点表示形式的各种不准确性,提出了一个问题,为什么至少在某些领域中,这种提高的准确性可能值得使用定点运算的复杂性。
使用定点特征值求解器是否有重大困难?他们将有多慢/快,不准确/准确?
Answers:
在某些情况下,使用定点算法可能是适当的。通常,对于科学计算(至少在大多数人认为的意义上来说),由于需要表达所遇到的大动态范围,因此它是不合适的。您以特征值问题为例,但是在科学界,人们常常对矩阵的最小特征值感兴趣(例如,在计算量子系统的基态时)。如果使用定点,则相对于大特征值,小特征值的准确性通常会大大下降。如果矩阵包含比例较大的条目,则较小的特征值可能完全无法表示工作精度。这是数字表示的问题。无论您如何进行中间计算,这些参数都成立。您可以计算出比例以应用于计算结果,但是现在您刚刚发明了浮点数。构造元素表现良好但特征值表现极差的矩阵很容易(例如威尔金森(Wilkinson)矩阵,甚至具有完全整数项的矩阵)。这些示例并不像看起来的那样病态,并且科学前沿的许多问题都涉及行为非常差的矩阵,因此在这种情况下使用定点是Bad Idea(TM)。
您可能会争辩说,您知道结果的大小,并且不想在指数上浪费一点,所以让我们谈谈中间物。使用定点通常会加剧灾难性取消和舍入的影响,除非您确实费尽心机才能更高精度地工作。性能损失将是巨大的,我可以推测,使用具有相同尾数位宽度的浮点表示形式将更快,更准确。
定点可以发光的一个区域是几何计算的某些区域。特别是如果您需要精确的算术运算或事先知道所有数字的动态范围,则定点可让您利用表示形式中的所有位。例如,假设您要计算两条线的交点,并以某种方式将两条线的端点归一化以位于单位平方中。在这种情况下,相交点可以比使用等效的浮点数来表示精度更高的位(这将浪费指数上的位)。现在,几乎可以肯定,这种计算所需的中间数需要以更高的精度计算,或者至少要非常小心地进行(例如,将两个数字的乘积除以另一个数字时,您需要非常小心)。在这方面,定点从表示的角度而不是从计算的角度更有利,并且我可以说,当您可以在算法输出的动态范围上确定确定的上限和下限时,这通常是正确的。这种情况很少发生。
我以前认为浮点表示形式是粗糙的或不准确的(为什么要浪费指数?!)。但是随着时间的流逝,我逐渐意识到,它确实是实数最好的表示形式之一。自然界中的事物以对数标度显示,因此实际数据最终会跨越很大范围的指数。为了达到最高的相对准确度,还需要对数刻度,使指数的追踪更加自然。“自然”表示的唯一其他竞争者是对称级别索引。但是,加法和减法在该表示中要慢得多,并且缺少IEEE 754的硬件支持。浮点标准已被大量考虑。,由数值线性代数的支柱组成。我想他知道数字的“正确”表示是什么。
作为为什么很少使用精确算术/不动点算术的示例,请考虑以下因素:
在有限元方法中,就像在科学计算中使用的几乎所有其他方法一样,我们得出的线性或非线性系统只是逼近现实世界。例如,在FEM中,要求解的线性系统仅是原始偏微分方程的近似值(它本身可能只是现实世界的近似值)。那么,为什么要付出巨大的努力来解决仅是近似的问题呢?
我们今天使用的大多数算法本质上都是迭代的:牛顿法,共轭梯度等。只要我们满意迭代的精度足以解决问题,就终止这些迭代。换句话说,我们在获得确切解决方案之前终止。和以前一样,当我们知道我们只是在计算近似值时,为什么要对迭代方案使用精确算法?
float
很快就不会再见了。
如果您查看此库以进行正确的舍入:CRlibm,您将在文档中看到通常必须证明算法是准确的(使用合理的证明)。为什么?函数结果的稳定性和收敛速度没有“一刀切”的答案。简而言之,没有“免费午餐”-您必须努力证明自己的推理是正确的。这是由于所建模的函数的行为所致,而不是由于基础硬件的行为所致(无论是使用整数还是浮点单元,尽管是的,它们都具有“陷阱”,例如上溢/下溢,非正规数等),即使结果是您要收敛到整数,用于查找结果的算法不一定非常稳定。
Eigen是一个C ++库,具有用于求解矩阵的各种算法,每种算法具有不同的属性。 本页包含一个表格,该表格讨论了用于求解矩阵的各种算法的速度与精度之间的权衡。我怀疑Eigen库可以满足您的要求。:-)