Costante matematica e
Ciao,
devo determinarmi il valore della costante matematica e utilizzando la funzione exp(x).
il secondo metodo è con la serie infinita (termina quando il termine è minore di un valore inserito dall'utente):
Ma in entrambi non riesco a trovare l'errore
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
Per la prima è facile... sbagli la printf.. la giusta sintassi è questa:
Per il secondo, non ho ben capito l'algoritmo che vuoi utilizzare, quindi al momento non so aiutarti...
printf("il valore e' %f", e);
Per il secondo, non ho ben capito l'algoritmo che vuoi utilizzare, quindi al momento non so aiutarti...
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).
Puoi anche far partire i da 1, inizializzando somma a 1, così da evitare un controllo dentro il 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; }
e se volessi ricavare il valore della costante e attraverso il limite? come potri fare il programma?
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\):
Non ha comunque molto senso scrivere programmi di questo tipo per calcolare le costanti numeriche.
\[ \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.