page perso
Programmation
FastMath

Peut-on calculer sinus, cosinus, exponentielle... plus rapidement qu'avec les fonctions de <math.h> ? Question intéressante. J'ai regroupé quelques algorithmes glanés sur le net, et les ai recodés bien proprement en C++ en un simple fichier header FastMath.h contenant les fonctions inline suivantes:

  • fastSqrt (racine carrée)
  • fastInvSqrt (inverse d'une racine carrée)
  • fastSin (sinus)
  • fastCos (cosinus)
  • fastTan (tangente)
  • fastASin (arcsinus)
  • fastACos (arccosinus)
  • fastATan (arctangente)
  • fastExp (exponentielle)
  • fastSinh (sinus hyperbolique)
  • fastCosh (cosinus hyperbolique)
  • fastTanh (tangente hyperbolique)

La performance de ces fonctions dépend bien sûr du compilateur, mais aussi de l'architecture. J'ai donc effectué quelques test montrant l'efficacité de ces versions dites "fast", sur G4, G5, et i686, avec un gcc 4.0. Les résultats sont ici : FastMath.pdf.

Les résultats sont en gros les suivants:

  • à n'utiliser qu'avec -O1, -O2 ou -O3
  • mieux vaut travailler en double, quitte à reconvertir en float
  • Sur G4, toutes les fonctions sont accélérées
  • Sur G5, éviter fastSqrt, fastInvSqrt, fastSin, fastCos et fastTan; si -O3 -ffast-math, fastSqrt et fastInvSqrt sont envisageables
  • sur i686, éviter fastSqrt, fastSin, fastCos, fastTan et fastTanh
  • On gagne toujours avec fastAsin, fastAcos, fastAtan, fastExp, fastSinh, fastCosh. On gagne aussi avec fastTanh, sauf sur i686

Pour effectuer les tests vous-mêmes, voici une achive zip contenant le code, les Makefile... : FastMath.zip.

 
 
Téléchargement
Voir le fichier d'en-tête : FastMath.h (15Ko)
Voir les résultats : FastMath.pdf (1,2Mo)
Archive du total : FastMath.zip (878Ko)
 
 

PHP MySQL Valid CSS!