2015-09-25 2 views
2

Je suis nouveau programmeur C et je travaille sur un projet d'école où je dois approximer la valeur ou pi. Mon professeur a déclaré que nous devons déclarer tous les termes entiers en utilisant long double. La console me montre en demandant à l'utilisateur le nombre de termes pour approximer pi donné une fonction. J'entre 1 pour le nombre de termes mais le code renvoie -0.00000000 au lieu de 4.00000000.C - long double et printf numéro

#include <stdio.h> 
#include <math.h> 

long double approx1(int terms) 
{ 
    long double pi = 0; 
    long double num = 4; 
    long double denom = 1; 
    int i; 

    for(i=1; i <= terms; i++) 
    { 
     if(i%2 != 0) 
     { 
      pi=pi+(num/denom); 
     } 
     else 
     { 
      pi=pi-(num/denom); 
     } 
     denom = denom + 2; 
    } 
    printf("%.8Lf\n", pi); 
} 

int main() 
{ 
    int terms; 
    long double pie; 

    printf("input number of terms, input 0 to cancel\n"); 
    scanf("%d", &terms); 

    while(terms != 0) 
    { 
     if(terms > 0) 
     { 
      pie = approx1(terms); 
      printf("%.8Lf\n", pie); 
      printf("GG mate\n"); 
      break; 
     } 
     else 
     { 
      printf("Incorrect input, please enter a correct input\n"); 
      scanf("%d", &terms); 
     } 
    } 
} 

Je n'ai pas eu de succès à la faire fonctionner (il fonctionne avec flotteur bien). Qu'est-ce que je fais mal? (J'utilise des blocs de code avec le compilateur inclus btw.)

+0

"tous les termes entiers utilisant' long double' "' long double' ne sont pas un type entier. Que voulez-vous dire? – Olaf

+1

Si votre IDE Code :: Blocks utilise le compilateur GCC MinGW (ce que je crois est commun), vous pouvez également rencontrer ce problème: http://stackoverflow.com/a/7136886/12711 Je crois que les versions plus récentes de MinGW résout le problème en implémentant un support personnalisé pour 'printf()' au lieu de s'appuyer uniquement sur 'msvcrt.dll'. Vous pouvez donc essayer une version plus récente de MinGW ou MinGW-w64. –

Répondre

5

Vous avez oublié d'ajouter une instruction return dans votre fonction approx1(). Sans cette instruction return, si vous utilisez la valeur renvoyée, elle appelle undefined behavior.

norme C11 Citant, chapitre §6.9.1

Si la } qui met fin à une fonction est atteinte, et la valeur de l'appel de fonction est utilisé par l'appelant, le comportement est indéfini.