我想使用long long
而不是double
数据类型来加速我的算法。我的算法是找到有向acyclic graph (DAG)
中的最短路径。简单地说,它添加边缘"E: a->b" to b
的权重,如果b
的新权重低于前一个权重,则它将与其设置为a的父项一起更新。
我的意思是,我的算法只是一些加法和比较运算。边的权重最初是"double"
的,我是否可以将它们乘以一个大数字并将它们投射到"long long"
。如果这个调整使我的程序更快,值得考虑。如何处理由于将big double
舍入为long long
而导致的不稳定性问题。
感谢
在i5 x64上,甚至模拟似乎比乘法快40%。整数加法也应该发生在更少的周期/更好的吞吐量中。关于"不精确性"问题,你应该意识到二重可能比整数更不精确。
计算将十进制转换为浮点时哪些数字会引起问题?
如果您可以访问原始数据(例如,权重的十进制表示,将它们乘以10的大幂应该会产生精确的整数,而不会出现任何舍入错误。对于长长度,唯一担心的是溢出。
如何解决可能的舍入不稳定性取决于权重的动态范围和最大迭代次数。例如,如果你的权重都小于1.0,大于2^-52,那么乘以2^52可以得到精确的整数,没有舍入误差。然后,"不稳定性"由溢出的可能性决定。(2^12*2^52)>=2^64。