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