我正在编写一个应用程序,在某个块中我需要对3 * 500 * 500次的实数进行取幂。当我使用exp(y * log(x))算法时,程序明显滞后。如果我使用另一种基于数据类型的算法,它会明显加快,但该算法不是很精确,虽然为模拟提供了不错的结果,但在速度方面仍然不完美。
对于比exp(y * log(x))更快的实际功率,是否有任何精确的求幂算法?
提前谢谢。
答案 0 :(得分:5)
如果您需要良好的准确性,并且您对先验的基础(x值)的分布一无所知,那么pow(x,y)是最好的便携式答案(在许多 - 不是所有 - 平台上) ,这将比exp(y * log(x))更快,并且在数值上表现也更好。如果你确实知道x和y可以存在的范围,以及有什么分布,那对于试图提供建议的人来说将是一个很大的帮助。
在保持良好准确性的同时更快地完成它的常用方法是使用一个库例程,该例程旨在同时为x值数组和y值数组执行许多这些计算。问题在于,这样的库实现往往需要花钱(如英特尔的MKL)或者是特定于平台的(例如,OS X上的Accelerate.framework中的vvpowf)。我对MinGW了解不多,所以其他人需要告诉你那里有什么。 GSL可能有这些方面的东西。
答案 1 :(得分:4)
根据您的算法(特别是如果您几乎没有添加),有时您可以在日志空间中工作(至少部分)。您可能已经考虑过这一点,但如果您的中间表示是log_x和log_y,则log(x ^ y)= exp(log_y)* log_x,这将更快。如果你甚至可以选择它,那么显然计算log(x ^ y)为y * log_x甚至更便宜。如果你甚至可以避免几个取幂,你可能会赢得很多表现。如果有任何方法可以重写任何循环,你必须在最内层循环之外进行取幂运算,这是一个相当确定的性能胜利。