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