Calcule log(x)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 974 fois - Téléchargée 20 fois

Contenu du snippet

Ce programme permer de calculer la valeur du logarithme népérienne d'un nombre réel x.
1) précision 10^(-60) et modifiable;
2) premier boucle donne la valeur de x sous la forme x=a*(2^i), avec 0<a<2;
3) La deuxième boucle: on utilise le développement de a sous la forme de Taylor, puis en trouve la valeur de lox(x)=log(a)+i*log(2);
4) Vitesse rapide.

Source / Exemple :


// Ce programme pour calculer la valeur de log(x).
// Mohamed Amine Tag at tagtogtig@hotmail.com.
//Tu peu choizir la la valeur précise depuis epsilon, ici la précision 10^(-60)
#include <iostream>
double absolu(double x) {return (x>=0?x:-x);}//Fonction |x|.                                                            
double ln(double x) {   // ici, on suppose x > 1
double sum, term;
double epsilon=0.000000000000000000000000000000000000000000000000000000000001, v=0.693147180559945309417232121458176568075500134360255254120678;
int i,j;
     i = 0;
     sum = 1;
     term = 1;
              while(x>1) {
              x=x/2;
              i++;
              }//Boucle pour écrire x sous la forme x=a*2^i
              if(x==1) //Si x divisable sur 2.
              sum=i*v;
                   else
                   {//Si x n'est pas divisable sur 2 entrez!
                   j=1;
                   while(absolu(term)>epsilon) {
                   term=(1-x)*term;
                   sum=sum+term/(j+1);
                   j++;
                   }//Boucle permet de calculer la valeur ln(r), où 1<x<2
                   sum=(x-1)*sum+i*v;
                   }
return sum;
}
int main() {
double x;
     std::cout<<std::endl<<"Ce programme calcule le logarithme n\x82p\x82rien de x"<<std::endl;
     std::cout<<std::endl<<"Entrez la valeur positive de x : ";
     std::cin>>x;
     if(x<=0) std::cout<<std::endl<<"Erreur, il faut x positif !";
     if(x>0){
             if(x<1) 
             std::cout<<std::endl<<"La valeur de Ln("<<x<<") = "<<-ln(1/x);
             else
             std::cout<<std::endl<<"La valeur de Ln("<<x<<") = "<<ln(x);
             }
     return 0;
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
Je ne comprends pas le raisonnement ...
Quoi qu'il en soit, une precision de 10e-60 avec des double ne veut rien dire
Messages postés
7
Date d'inscription
mardi 17 février 2009
Statut
Membre
Dernière intervention
20 juillet 2011

La fonction while(fabs(term)>epsilon) ne s'arrête pas quand la condition n'est pas fausse.
Donc, nous sommes arrivés à notre objectif d'accès à la valeur epsilon = 10^(-60).
Donc le problème en dehors de notre mains ^^.
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
Pour revenir a la "precision de 10e-60" ... c'est tout bonnement absurde d'affirmer cela :
Avec les doubles au maximum tu peux avoir 16 chiffres significatifs, donc la précision maximale est de 10e-16

Il ne faut pas confondre le fait que l'on puisse ecrire le nombre 10e-100 dans un double et le fait le nombre 1.000 000 000 000 000 1 * 10e-100 le soit aussi alors que 1.000 000 000 000 000 01 * 10e-100 (avec un 0 de plus) soit identique a 10e-100 !
Bref 10e+100 additionne avec 10e-100 n'a aucun sans dans l'arithmetique des flottants.


Pour finir, un petit retour sur des choses plus mathemtiques :
ton test d'arret est que fabs(term)<epsilon, cele ne veut absolument pas dire que l'ecart a la vraie valeur est plus petite d'epsilon, mais seulement que le dernier terme de la serie de Taylor est plus petit en module a epsilon.
Avec ce raisonnement il suffirait de prendre la serie harmonique somme 1/n et dire qu'il suffit de s'arreter quand n depasse 1/epsilon ... alors que la serie harmonique diverge (equivalent a ln(n)+constante d'Euler+...).
Donc morale de l'histoire ne pas confondre grandeur du dernier terme avec l'erreur commise sur l'approximation
Messages postés
3
Date d'inscription
dimanche 28 mars 2010
Statut
Membre
Dernière intervention
11 décembre 2010

merci pour cette information de calculer log(x),
j'ai un exercice de la langage c slv:
Ecrire un programme pour la gestion de stock
le stock est identifier par nom,prix unitaire,stock,stock minimal.
les operations a gérer:
1.Ajouter un produit
2.Modifier un produit
3.Supprimer un produit
4.Rechercher un produit
5.trier les produits par prix unitaire
6.trier les produit par stock
7.liste des produits a commander
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.