我正在为一个项目用 C++ 编写一个小型且不足的线性代数库(对不起)。我正在使用双精度数字实现矩阵和运算。我做得对吗?我应该实现一个模板类吗?周围有更精确的类型吗?
6 回答
我会使用模板来实现类/结构。一开始,你很可能只满足于double
,但我发现在我没有将矩阵作为模板实现的每个项目中,我后来都后悔了。
此外,它还让您有机会使用更有趣的元素代数 - 区间算术、概率分布、复杂数学、定点匹配、子矩阵、简单数学 :-) 等。
我使用模板编写了一个 C++ 线性代数库。我的想法是有一天我们可能想要使用复数或扩展精度数。那可能是七年前的事了,我们还没有这样做。我们几乎总是使用双精度数作为模板类型,并且我们有 typedefs 来简化它。
有几次我们采用了另一种方式,使用小于double 的类型。例如,我们在此处描述的内存绑定应用程序中使用了浮点数而不是双精度数。但是 99.9% 的时间我们使用双打。
如果您确实使用模板参数,请注意使用整数类型但隐式需要浮点类型。例如,假设您有一个矩阵,其条目都是整数,因此您使用 matrix<int> 类。但是然后您将其传递给线性求解器。现在你的算术是使用整数除法完成的,你的结果是错误的。(我已经做到了!)
我正在为一个项目用 C++ 编写一个小而不足的线性代数库(对不起)
哎哟!小心,非常非常小心...查看JAMA/TNT——它有 NIST 的批准印章,他们已经处理了一些“更简单”的线性代数数学,例如各种因式分解算法。线性代数涉及许多与数值精度有关的棘手问题(例如希尔伯特矩阵),尽管我喜欢做自己的事情,但这是您可能希望使用已经过良好测试的良好坚实基础的领域之一。
您应该可以使用 long double (不太确定),但算法本身可能比矩阵的精度更重要。
最后的问题答案:是的,有,它被称为long double
并且至少与double
. 至于是否使用模板,是的,我会使用模板。这对他们来说是一个很好的用例,我认为这将使移植到其他一些标量数字类型更容易。然后,您也可以只键入一个浮点数和/或双精度矩阵,具体取决于您正在运行的系统以及哪个系统在那里运行得更快/更好。
不要为自己做任何额外的工作。如果您可以使用双倍(或长双倍),那就去吧。
听起来这只是一个小项目,在这种情况下,模板的东西只会为你工作。
另一个尚未讨论的选项是使用模板来定义您的元素类型。这不会导致太多(如果有的话)额外工作,但允许稍后进行一些更改。
没有其他类型比 long double 更精确,它也有硬件支持。但是,如果您觉得需要更精确,您可以自由地制作自己的类型。然而,即使经过广泛的优化,它们也会比原生的 double 类型慢很多。