快速指数运算:real^real(C++ MinGW,Code::Blocks)

4
我正在编写一个应用程序,在某个块中需要对实数进行3*500*500次幂运算。当我使用exp(y*log(x))算法时,程序明显会出现延迟。如果我使用另一种基于数据类型玩耍的算法,则速度显着更快,但该算法不太精确,虽然为模拟提供了不错的结果,但在速度方面仍不完美。
是否有任何精确的幂运算算法,比exp(y*log(x))更快?
谢谢您的帮助。
2个回答

5
如果你需要高精度,并且事先不知道基数(x值)的分布情况,那么pow(x, y)是最佳的可移植答案(在许多平台上,这比exp(y*log(x))更快,而且在数字上的表现也更好)。如果你确实知道x和y可能处于的范围以及它们的分布情况,那么这将对提供建议的人非常有帮助。
通常,为了保持良好的准确性并加快计算速度,可以使用专门设计用于同时处理x值和y值数组的库函数。但这样的库实现往往要花费金钱(例如Intel的MKL),或者是特定于某个平台(例如OS X上的Accelerate.framework中的vvpowf)。我不太了解MinGW,所以其他人需要告诉你那里有什么可用的资源。GSL可能会有类似的东西。

4

根据你的算法(特别是如果你没有太多的加法),有时可以在对数空间下工作(至少部分)。你可能已经考虑过这一点,但如果你的中间表示是log_x和log_y,那么log(x^y) = exp(log_y) * log_x,速度会更快。如果你能够有选择地使用它,那么计算log(x^y)作为y * log_x甚至更便宜。如果你可以避免甚至只是几个指数运算,你就可以获得很高的性能。如果有任何方法可以重写你的循环,以便将指数运算操作移到最内层循环之外,那么这几乎可以确定会提高性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接