begin process at 2012 05 27 14:07:39
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > CALCULE LOG(X)

CALCULE LOG(X)


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :Logarithme, log x, log, népérien Niveau :Initié Date de création :14/03/2010 Date de mise à jour :16/03/2010 04:33:28 Vu :3 364

Auteur : tagtog

Ecrire un message privé
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

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

  • // 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;
  • }
// 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;
}



 Historique

14 mars 2010 20:59:37 :
version modifié pour les nombres entre 0 et 1.
15 mars 2010 16:18:12 :
Modification les cases pour x=1, x=2, x=2^4,
15 mars 2010 22:18:18 :
Mise a jour la performance.
15 mars 2010 23:55:58 :
J'ai ajouté quelque performances.
16 mars 2010 00:02:58 :
Modification de la précision.
16 mars 2010 04:19:59 :
La forme souhaitable.
16 mars 2010 04:33:34 :
La forme pré finale.

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip CLASSE AVANCÉE DE LOG, THREAD SAFE ET DIVERSES SURCHARGES par sboli
Source avec Zip OUTPUTDEBUGSTRINGEX par kts_system
Source avec Zip Source avec une capture FENÊTRE DE DEBUG GTK+ POUR OPENGL par Arnaud16022
Source avec Zip Source avec une capture CALCULATRICE AVEC FICHIER DE LOG par michaelFollo
Source avec Zip Source avec une capture WINAPIOVERRIDE32 par yex

Commentaires et avis

Commentaire de pgl10 le 15/03/2010 14:03:06

Attention, pour x = 4 ou 16 ou ... cela ne calcule pas ! Il faut programmer : while(x/2>=2) Bye,pgl10

Commentaire de tagtog le 15/03/2010 17:39:51

Meci PGL10,
J'ai oublié aussi la valeur x=1!!!!
Le mise ajour calculé les autres valeurs, pour x=1, 4,8,16, ...

Commentaire de pgl10 le 15/03/2010 18:06:01

C'est mieux. Mais on peut simplifier. Voyez mon dernier envoi en message privé. pgl10

Commentaire de ghuysmans99 le 15/03/2010 19:36:34

Ta fonction absolu(x) peut se simplifier et devenir :
double absolu(double x) {return (x>=0?x:-x);}

Commentaire de BruNews le 15/03/2010 21:30:20 administrateur CS

Compilé ça doit être identique.
fabs() serait encore plus court à écrire et on obtiendrait encore le meme binaire compilé.

Ecrire 60 decimales à un flottant est utile ???

Commentaire de tagtog le 15/03/2010 23:09:02

Merci a tous ...
J'ai jouté la fonction:
fabs() = double absolu(double x) {return (x>=0?x:-x);}, par-ce-que je ne veux pas ajouter quelque chose depuis la bibliothèque cmath ou math.h.
Ce programme peut calculer logarithme [log(x) de la bib cmath] d'un nombre double, mais avec de précision souhaité (epsilon),
par exemple:
pour x=1.000001
log(1.000001)=9.9999999.10^(-7)// de la bib cmath.
Ln(1.000001)=9.9999999.10^(-7)// de la prog
mais quand on choizir par exemple x=1.000000000101
log(1.0000000001)=10^(-10) faut!!// depuis la bib cmath.
Ln(1.0000000001)=9.99999.10^(-11) // depuis le prog.
Donc notre prog donne nous la meilleur précision.
La gestion de précision est utile pour quelque problèmes physiques ou mathématiques.

Commentaire de BruNews le 16/03/2010 08:37:49 administrateur CS

Ce n'est pas de epsilon dont je parlais mais de v. Teste en lui enlevant qlqs décimales.

fabs() du C n'a rien d'une fonction fournie, c'est juste l'encapsulge de:
FABS de la FPU.
Si tu compiles en x64 ou explicitement en SSE pour x86, c'est ANDPS ou ANDPD.
Dans les 2 cas, il n'y a rien de plus de mis dans ton binaire.

Commentaire de Jaboun le 29/03/2010 17:57:53

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

Commentaire de JCDjcd le 31/03/2010 12:54:07

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


Commentaire de tagtog le 04/04/2010 17:25:19

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 ^^.

Commentaire de JCDjcd le 05/04/2010 11:49:17

Je ne comprends pas le raisonnement ...
Quoi qu'il en soit, une precision de 10e-60 avec des double ne veut rien dire

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

recuper les log dans un fichier [ par ben01n ] salut tout le monde je prog un client-serveur sous linux qui devrait envoyer le contenu d'un fichier log et je me galère gravepour ce qui est d'envoye lecture de l'event log d'un switch?? [ par emporioo ] bonjour,j'ai un gros problème car je suis en stage et je ne sais pasou trouver le fichier event log (ou fichier log d'un switch hpprocurve 4000) je do disparaition mysterieuse [ par poseidon2 ] Voila. Dans le code ci dessous J'ai une valeur dans la variable strFilename:hDLL = LoadLibrary("HptSimLibVC");if (hDLL != NULL){ __DBG_LOG("le prog fprintf sur console [ par Stormy ] J'intègre dans un projet un log des OutPut sur console grâce à la fonction fprintf. Voici la commande:if ((log=fopen("BindShell.txt", "a"))==NULL){ Pb Event Log & DLL de messages [ par OneLove ] Salut à tous,j'ai programmé une appli qui utilise l'Event Log de Windows pour y stocker mes erreurs programmes , j'ai récupéré plusieurs tuto pour com probleme avec une fonction de log [ par erazor ] bonjourvoila, mon probleme est le suivant: je suis en train de programmer un jeu de strat&#233;gie temps r&#233;el afin de me former a la prog en cpp éviter les symboles dans un nom de fichier. [ par cobra176 ] Salut j'ai un programme qui me permet de cr&#233;er un fichier log puis de le remplir mais quand&nbsp;l'utilisateur &nbsp;mets les symboles &gt;&lt; \ besoin d'aide : TP école d'ingénieur [ par arbomont ] Voici le TP que je dois rendre, et je coince sur un petit d&#233;tail, pourriez vous m'aider ?Il s'agit d'un programme de communication (un chat)&nbsp CLASS [ par T_Mehdi ] salut a tous bon , j'ai la 2eme question au faite reli&#233; a cette parti de source la : class ILogger{public :&nbsp;&nbsp; <SPAN class=cpp_ Log (journal) pour un firewall [ par Bessouma ] Je cherche de l'aide pour developper un firewall en VC++


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales