2009-09-20 10 views
4

Je suis en train d'écrire une application où dans un certain bloc j'ai besoin d'exponentialiser des réels autour de 3 * 500 * 500 fois. Lorsque j'utilise l'algorithme exp (y * log (x)), le programme est sensiblement retardé. C'est beaucoup plus rapide si j'utilise un autre algorithme basé sur le jeu avec des types de données, mais cet algorithme n'est pas très précis, bien qu'il donne des résultats décents pour la simulation, et il n'est pas encore parfait en termes de vitesse. Y a-t-il un algorithme d'exponentiation précis pour les puissances réelles plus rapide que exp (y * log (x))?Exponentiation rapide: real^real (C++ MinGW, Code :: Blocks)

Merci d'avance.

Répondre

5

Si vous avez besoin d'une bonne précision, et que vous ne savez rien sur la distribution des bases (valeurs x) a priori, alors pow (x, y) est la meilleure réponse portable (sur beaucoup - pas tous - plates-formes, ce sera plus rapide que exp (y * log (x)), et est également mieux comporté numériquement). Si vous savez quelque chose sur les fourchettes dans lesquelles se situent x et y, et avec quelle distribution, ce serait une aide précieuse pour les personnes qui essaient de donner des conseils. La manière habituelle de le faire plus rapidement tout en conservant une bonne précision consiste à utiliser une routine de bibliothèque conçue pour effectuer plusieurs de ces calculs simultanément pour un tableau de valeurs x et un tableau de valeurs y. Le hic, c'est que de telles implémentations de bibliothèques tendent à coûter de l'argent (comme le MKL d'Intel) ou à être spécifiques à la plate-forme (vvpowf dans Accelerate.framework sur OS X, par exemple). Je ne sais pas grand-chose sur MinGW, alors quelqu'un d'autre devra vous dire ce qui est disponible là-bas. Le GSL peut avoir quelque chose dans ce sens.

4

Selon votre algorithme (en particulier si vous avez peu ou pas d'ajouts), vous pouvez parfois travailler (au moins partiellement) dans l'espace de journal. Vous l'avez probablement déjà considéré, mais si votre représentation intermédiaire est log_x et log_y alors log (x^y) = exp (log_y) * log_x, ce qui sera plus rapide. Si vous pouvez même être sélectif à ce sujet, il est évident que calculer log (x^y) comme y * log_x est encore moins cher. Si vous pouvez éviter même quelques exponentiations, vous pouvez gagner beaucoup de performance. S'il y a un moyen de réécrire les boucles que vous avez pour obtenir les opérations d'exponentiation en dehors de la boucle la plus intérieure, c'est une victoire de performance assez certaine.

+0

+1 pour la suggestion d'espace de journalisation. –