0

我想使用long long而不是double数据类型来加速我的算法。我的算法是在有向的acyclic graph (DAG). 简单地说,它添加了一条边的权重"E: a->b" to b,如果新的权重b低于之前的权重,则它与设置为 a 的父级一起更新。

我的意思是,我的算法只是一些加法和比较操作。边的权重最初是"double",我是否可以将它们乘以一个大数并将它们转换为"long long"。如果此调整使我的程序更快并且值得考虑。如何处理由于四舍五入导致的不稳定big double问题long long

谢谢

4

1 回答 1

1

在 i5 x64 上,甚至imul 似乎也比双倍乘法快 40%。整数加法也应该以更少的周期/更好的吞吐量发生。关于“不精确”问题,您应该知道双精度数可能比整数更不精确。

计算将十进制转换为浮点时哪些数字会导致问题?

如果您可以访问原始数据(例如权重的十进制表示,将它们乘以 10 的大幂应该会产生没有任何舍入伪影的精确整数。使用 long long 唯一的问题是溢出问题。

如何解决可能的舍入不稳定性取决于权重的动态范围和最大迭代次数。例如,如果您的权重都小于 1.0 且大于 2^-52,则乘以 2^52 会得到精确的整数,而不会出现舍入误差。那么“不稳定”是由溢出的可能性决定的。(2^12 * 2^52) >= 2^64。

于 2013-02-05T06:47:43.063 回答