Costante matematica e

nadia891
Ciao,
devo determinarmi il valore della costante matematica e utilizzando la funzione exp(x).

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

int main(void)

{

double e;double x;

printf("Questo programma restituisce il valore della costante matematica e\n");
x=1.00;

e = exp(x);
printf("il valore e' %f", &e);

return 0;

}

il secondo metodo è con la serie infinita (termina quando il termine è minore di un valore inserito dall'utente):
#include <stdio.h>



int main (void)
{
 int i=0; double a; double somma=0; double eps;int d=0;
 
 
 
 
 printf("Questo programma restituisce il valore di e\n");
 printf("inserisci il valore di epsilon molto piccolo (<0) :");
 scanf("%lf",& eps);
 
 
 do {
 
 
 d=i+1;
 
 a=1.0;
 if (d!=0){
	 a=a*((double)1/(double)d);
	 d=d-1;
	 
	 }
	 somma =somma+a;
	 
	}while (a> eps);
	 
	
	printf(" il valore della costante matematica e e': %f",somma);
	 return 0;
	 
	 }

Ma in entrambi non riesco a trovare l'errore

Risposte
Obidream
Per la prima è facile... sbagli la printf.. la giusta sintassi è questa:
printf("il valore e' %f", e);


Per il secondo, non ho ben capito l'algoritmo che vuoi utilizzare, quindi al momento non so aiutarti...

claudio862
Non incrementi il valore di i. Aggiungi i += 1 alla fine del ciclo.
Inizializzi a = 1.0 ad ogni iterazione, mentre devi farlo solo una volta prima di entrare nel ciclo.
La variabile d dovresti inizializzarla a i, non i+1, ma a dire il vero è ridondante, ti basta la variabile i.
Inoltre il valore di epsilon deve essere maggiore di zero, non minore come hai scritto tu (ma qua penso sia stata una svista).

#include <stdio.h>

int main (void)
{
    int i = 0; double a = 1; double somma = 0; double eps;

    printf("Questo programma restituisce il valore di e\n");
    printf("inserisci il valore di epsilon molto piccolo (> 0): ");
    scanf("%lf", & eps);

    do {
        if (i != 0){
            //a = a * ((double)1/(double)i);
            // Si può scrivere più semplicemente come a = a / d,
            // dove i cast non servono perché a è un double.

            a /= i;
        }

        somma += a;
        i += 1;

   	} while (a > eps);

   	printf("Il valore della costante matematica e e': %lf\n", somma);
    return 0;
}


Puoi anche far partire i da 1, inizializzando somma a 1, così da evitare un controllo dentro il ciclo:

#include <stdio.h>

int main (void)
{
    int i = 1; double a = 1; double somma = 1; double eps;

    printf("Questo programma restituisce il valore di e\n");
    printf("inserisci il valore di epsilon molto piccolo (> 0): ");
    scanf("%lf", & eps);

    do {
        a /= i;
        somma += a;
        i += 1;

   	} while (a > eps);

   	printf("Il valore della costante matematica e e': %lf\n", somma);
    return 0;
 }

nadia891
e se volessi ricavare il valore della costante e attraverso il limite? come potri fare il programma?

apatriarca
Intendi dire calcolando il seguente limite notevole?
\[ \lim_{x \to \infty} \left( 1 + \frac 1 x \right)^x = e \]
Preso un numero sufficientemente alto la formula restituisce un risultato sufficientemente vicino ad \(e\) per la definizione di limite. Il problema è che la precisione di float e double non è infinita e lavorare vicino ai più grandi o più piccoli numeri razionali rappresentabili può portare facilmente a risultato scorretti. Si potrebbe infatti per esempio avere che \( 1 + 1/x = 1 \) e quindi ottenere come risultato \(1\).. Per esempio, i seguenti valori li ho ottenuto prendendo come valori di \(x\) le prime \(100\) potenze di \(2\):
[2.0,2.25,2.44140625,2.565784513950348,2.6379284973666,2.676990129378183,2.697344952565099,
2.7077390196880207,2.7129916242534344,2.7156320001689913,2.7169557294664357,2.7176184823368796,
2.7179500811896657,2.718115936265797,2.7181988777219708,2.718240351930294,2.7182610899046034,
2.7182714591093062,2.718276643766046,2.718279236108013,2.718280532282396,2.7182811803704374,
2.7182815044146706,2.71828166643684,2.7182817474479384,2.7182817879534906,2.718281808206268,
2.7182818183326565,2.718281823395851,2.718281825927448,2.7182818271932465,2.718281827826146,
2.7182818281425956,2.7182818283008205,2.718281828379933,2.718281828419489,2.718281828439267,
2.718281828449156,2.7182818284541006,2.718281828456573,2.718281828457809,2.7182818284584274,
2.7182818284587364,2.7182818284588905,2.718281828458968,2.7182818284590065,2.718281828459026,
2.7182818284590358,2.71828182845904,2.718281828459043,2.718281828459044,2.7182818284590446,
2.718281828459045,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0]

Non ha comunque molto senso scrivere programmi di questo tipo per calcolare le costanti numeriche.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.