quelle méthode pour implémenter la fonction exp dans c?

Je veux calculer l’erreur de la fonction exp sous précision finie (type de données est double). Est-ce que la série taylor ou un autre algorithme spécial?

Généralement, le meilleur moyen d’implémenter e x est d’appeler la fonction exp fournie par votre plate-forme informatique.

À défaut, implémenter la fonction exp est compliqué et nécessite plusieurs compétences ésotériques. Une implémentation implique généralement:

  • Tester l’entrée pour divers cas spéciaux, tels que NaN.
  • Multiplier l’entrée par une représentation spécialement préparée de log 2 e pour transformer le problème de e x en 2 y , où y = x • log 2 e.
  • Déplacement de la partie entière de y dans le champ exposant d’un codage en virgule flottante.
  • Evaluer l’exponentielle de la partie fractionnaire de y avec un polynôme minimax .
  • Combinant les deux résultats ci-dessus.

Aditionellement:

  • Le polynôme minimax est conçu, souvent avec un logiciel spécial, utilisant l’ algorithme de Remez ou quelque chose de similaire.
  • Le travail doit être effectué avec une précision accrue pour que le résultat final puisse être calculé avec précision.

Les séries de Taylor sont inappropriées pour évaluer les fonctions car elles sont inexactes loin de leurs points centraux. Cela signifie qu’ils prennent trop de termes pour converger vers la précision nécessaire. Avoir trop de termes prend non seulement du temps, mais il est également difficile de faire l’arithmétique avec précision.

Bien que je sois d’accord avec une grande partie de ce qu’Eric a dit dans sa réponse, quelques points méritent d’être ajoutés. J’ai écrit un outil qui permet, entre autres, d’évaluer la précision exponentielle à élevée (spécifiée par l’utilisateur).

Lorsque la précision peut varier, il est indispensable de recourir à des outils tels que les approximations en série, car aucune approximation polynomiale ne suffira. Même dans ce cas, il existe de nombreuses astuces. En fait, j’ai été surpris par la variété de trucs que j’ai utilisés pour accélérer une telle série.

Une bonne référence pour toute entreprise de ce type est celle de Hart, “Computer Approximations”, un livre qui n’est malheureusement pas facile à trouver. Il offre de nombreuses approximations polynomiales, mais aborde également les astuces de la réduction de distance avec un degré de détail modéré.

La série exponentielle est elle-même particulièrement intéressante. Je décris les méthodes que j’ai employées pour l’exponentielle à la section 4.1 du fichier HPFMod2.pdf, fourni avec HPF .

Par exemple, pour calculer exp (123.456789), on peut essayer d’utiliser directement une série, mais il est préférable de stocker la valeur de e elle-même. Ensuite, nous pouvons utiliser une réduction de plage pour calculer

 exp(123.456789) = exp(1)*exp(2)*exp(8)*exp(16)*exp(32)*exp(64)*exp(.456789) 

Nous obtenons les exponentielles des puissances de 2 en répétant la quadrature, puis la partie décimale convergera modérément rapidement. (Par exemple, 31 termes sont nécessaires pour une précision de 100 chiffres dans la série finale.)

Cependant, supposons que nous venions de remarquer que

 123.456789 = 28*ln(10) + 58.9844063961667 

Maintenant, nous pourrions écrire l’exponentielle souhaitée comme suit:

 exp(123.456789) = 10^28 * exp(1)*exp(2)*exp(8)*exp(16)*exp(32)*exp(-0.0155936038332811) 

Tant que nous connaissons (l’ayant stockée) la valeur de ln (10), la série finale ne nécessitera qu’environ 17 termes pour obtenir la précision désirée de 100 chiffres.