begin process at 2012 02 09 15:15:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > CALCUL DE PI

CALCUL DE PI


 Information sur la source

 Description

Il calcule la valeur de Pi à epsilon près.

Source

  • #include <stdio.h>
  • #include <math.h>
  • void main()
  • {
  • int a;
  • float epsilon, i, s=1;
  • int n=1;
  • printf("\nCalcul de pi à epsilon près.\n");
  • printf("Entrez la précision désirée (epsilon): ");
  • fflush(stdin);
  • scanf("%f", &epsilon);
  • while((1/(2*n+1))<epsilon)
  • {
  • if((n%2)==0) /* teste si n est pair */
  • i=-1;
  • else
  • i=1;
  • s+=(-1*i)/(2*n+1);
  • n++;
  • }
  • a=-log10(epsilon);
  • printf("\nValeur de pi à %*.*f près: %*.*f", a+2, a, epsilon, a+2, a, 2*s);
  • }
#include <stdio.h>
#include <math.h>

void main()
{
int a;
float epsilon, i, s=1;
int n=1;
printf("\nCalcul de pi à epsilon près.\n");
printf("Entrez la précision désirée (epsilon): ");
fflush(stdin);
scanf("%f", &epsilon);
while((1/(2*n+1))<epsilon)
	{
	if((n%2)==0)    /* teste si n est pair */
		i=-1;
	else
		i=1;
	s+=(-1*i)/(2*n+1);
	n++;
	}
a=-log10(epsilon);
printf("\nValeur de pi à %*.*f près: %*.*f", a+2, a, epsilon, a+2, a, 2*s);
}



 Sources du même auteur

Source avec Zip Source avec une capture DEVINER 1 NOMBRE EN FENÊTRES FILLES
MASTERMIND EN LANGAGE C BASIQUE
CARRÉ MAGIQUE
RECHERCHE DES NOMBRES PARFAITS
JEU DE CODE SECRET

 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

Commentaires et avis

Commentaire de Kirua le 25/08/2004 02:29:14

pour tester si un nombre est pair, utiliser l'opérateur modulo est bouffe-ressource, surtout si tu dois le faire svt. regarde:

un nombre est sauvegardé en mémoire en base 2 (en binaire), il est donc formé de bits. ainsi, le chiffre 17 est écrit comme ceci en binaire:

10001

le bits de poids fort (celui qui ajoute le plus de valeur) est à gauche, comme avec le système décimal (5009 est bcp parce que le nobmre de poids fort vaut 5, ce qui vaut 5000 pour la valeur totale; le 9 n'ajoute que 9 à la valeur totale, parce que c'est le nombre de poids faible).

en réalité, avec les bases on fait comme ça (exemple pour la base 2) (note: ^ veut dire exposant)

2^4  2^3  2^2  2^1  2^0
  1       0       0      0      1

(note: x^0 = 1, quel que soit x)

donc le chiffre ici vaut 2^0 + 2^4 = 1 + 16 = 17.

tu peux facilement comprendre que tous les nombres pairs auront le bits de poids faible (à droite) à 0, et les nombres impairs l'auront à 1, puisque la valeur totale est une somme de puissances de 2, et que 2^0 est le seul nombre  impair!

ce qu'il faudrait dc, pr tester la parité d'un nombre, c'est pouvoir lire son dernier bit (son bit de poids faible), comme ça on saurait à très faible coup s'il est pair ou pas (car les opérations sur les bits ne coutent quasi rien).

chance: ça existe! tu dois utiliser l'opérateur &. voici une sorte de table de vérité de cet opérateur:

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

tu le vois, si on applique l'opérateur & sur deux bits, ça ne renvoie true (1) que si les deux  bits comparés sont activés. donc si tu as ton 17 (10001) et que tu le 'AND' (&) avec 00001, tu auras ceci:

10001
00001
---------&
00001

puisque dans ton nombre 00001 il n'y a que le dernier bit qui est allumé, la condition ne peut être vraie au global QUE si le dernier bit du nombre original (17) l'est aussi! si par contre tu avais 6:

110 ( = 4+2 = 6)

et que tu le AND avec 001, ça te donne:

110
001
------&
000

et donc une valeur globale de 0, ce qui signifie que le dernier bit n'est pas allumé, et que donc le nombre 6 est pair!


pour résumer, tu devrais remplacer ceci:

if(n%2) //si n est impair

par ceci:

if(n&1)

qui coûte bcp moins cher en terme de ressources.

bonne journée,

Kirua

Commentaire de djl le 25/08/2004 08:40:07

non Kirua, i&1 n'est pas plus rapide que i%2 (fait le test)
il faut jamais se croire plus fort que le compilo, il ne fait aucun doute que le modulo sera "inliner"
le code asm généré est identique

Commentaire de Pasc41 le 25/08/2004 11:13:14

"Modulo" ou "et logique" c'est clair que la faiblesse de l'algo ne se situe pas ici, je suis d'accord que c'est le travail du compilateur...
Bref, le développement en série de l'arctangente (arctan(1)=Pi/4, utilisé ici) est extrement lent pour converger vers Pi, faîtes le test pour avoir une 20aine de décimales ça prend trop de temps...

Commentaire de Kirua le 25/08/2004 11:34:19

hmm, tant pis pour l'optimisation. mais au passage j'aurai pê appris qq ch à pinderlot (peut être ^^). laissez moi au moins ça pour survivre! ;)

Commentaire de BlackGoddess le 25/08/2004 14:21:51

fflush(stdin); est une erreur, on ne doit jamais modifier un flux d'entrée, seulement un flux de sortie => fflush(stdout);

Commentaire de BlackGoddess le 25/08/2004 14:30:37

je viens de l'executer sous vc++7, en entrant par exemple 0.001, et il me retourne toujours 2
si je mets une valeur comme 1, 100, il boucle indéfiniment.

Commentaire de pinderlot le 25/08/2004 15:11:40

Kirua et Pasc41, exact pour la convergence, ce n'est pas la méthode la plus rapide... et PI (arf c portnawak ce jeu de mot) mes cours de math spé M' sont déjà loin derrière moi lol.

Commentaire de djl le 25/08/2004 16:59:02

pour fflush( stdin ), je l'avais deja dis, c'est pas portable et dangereux et si on a le besoin de sauter tout ce qu'il y a dans un inputstream c'est qu'a la base l'utilisation est mauvaise

une seule regle :
toujours lire ce qu'on saisi

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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 : 2,434 sec (3)

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