我最近阅读了一些需要进行大量乘法的java科学代码。
实现使用日志值,因为开发人员认为它更快更精确。
例如,
如果他/她需要计算双倍值A[1]*A[2]*...*A[n]
,则他会让La[i]=log(A[i])
,然后La[1]+La[2]...+La[n]
。
(所有值都是最终值,因此可以重用。无需担心一次性log()操作。)
对我来说,我真的不确定这是否会带来显着的性能优势。
我在线查看了What's the relative speed of floating point add vs. floating point multiply和https://agner.org/optimize/)。在现代CPU中,我没有看到FP的加速明显快于FP乘法。
我还阅读了IEEE的double二进制表示标准。我不认为日志值可以保留更多信息以使价值更精细,因为IEEE标准也在做同样的事情。
您怎么看?
答案 0 :(得分:-2)
目的可能不是表现,而是处理非常大的数字。当处理系统中的原子数,状态总数等时,这可能很有用,这很容易超出浮点范围。