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