Altro programmino in c!
qualcuno mi potrebbe dire dove è sbagliato?:
#include
main ()
{
long double x;
long double y;
printf("ciao dammi una frequenza\n");
scanf("%Lf",&x);
y= 12000/{12000 + [4,46* x - 1/((x* 0,23000001)*(x* 0,23000001))]};
printf("il risultato è:%Lf\n",y);
return 0;
}
#include
main ()
{
long double x;
long double y;
printf("ciao dammi una frequenza\n");
scanf("%Lf",&x);
y= 12000/{12000 + [4,46* x - 1/((x* 0,23000001)*(x* 0,23000001))]};
printf("il risultato è:%Lf\n",y);
return 0;
}
Risposte
ma hai un errore in compilazione o in esecuzione? Oppure.....???
credo proprio sia in compilazione
e..... qual'e' l'errore??? Anche se un'idea l'avrei.....

y= 12000/{12000 + [4,46* x - 1/((x* 0,23000001)*(x* 0,23000001))]};
Questa riga è totalmente sbagliata. I numeri "con la virgola" si scrivono con il punto in C, come è tradizione nei paesi anglosassoni. La virgola ha in effetti un altro significato. Le uniche parentesi che puoi usare per delimitare parti delle formule sono le parentesi tonde, parentesi graffe e quadre hanno altri utilizzi in C. L'uso di più tipi di parentesi è comunque solo comune nei livelli più bassi di istruzione, nei libri di matematica universitari è abbastanza raro vedere una parentesi diversa da quella tonda in contesti come questo. Anche le costanti hanno un tipo in C e una formula come 3/2 è uguale a 1 e non 1.5 in C.
La riga corretta avrebbe dovuto essere:
y = 12000.0 / (12000.0 + (4.46 * x - 1.0 / ((x * 0.23000001) * (x * 0.23000001))));
grazie per i suggerimenti ora in effeti il programma viene eseguito pero purtroppo mi da sempre risultato -2.00000 per qualunque valore della variabile x
.

Ma cosa stai cercando di fare esattamente?
calcolando a mano, con x=1 il risultato dovrebbe essere 1,0 qualcosa.....
sto usando codeblocks beh io vorrei semplicemente dare un valore alla variabile e vorrei che il programmino mi restituisse un valore....in pratica sto facendo una esperienza di laboratorio...la x in realta è una frequenza di oscillazione di un fascio di elettroni..l'esperienza consistenel partire da una frequenza particolare e via via passare a frequenza piu basse....ognuna di queste frequenze va messa nella formula che poi mi permettera di fare un grafico........io sono andato su "build"e poi su play..si è aperta la schermata che mi chiede di inserire una frequenza...lo faccio poi invio e come risultato mi da sempre -2
strano... io l'ho provato in pascal (delphi) e con un ciclo for da 1 a 1000 ottengo un valore decrescente della y, a partire da 1,00120...
A me il risultato viene 1.001205. Sto usando Visual C++ Express. Il programma corretto è
In ogni caso sarebbe meglio modificare la formula in modo da renderla più robusta e meno dipendente da errori. È possibile che il problema nel tuo codice possa essere dovuto ad una qualche opzione di compilazione che favorisce la velocità alla qualità di calcolo.
#include <stdio.h> int main () { long double x; long double y; puts("Ciao, inserisci la frequenza."); scanf("%Lf",&x); y= 12000.0 / (12000.0 + (4.46 * x - 1.0 / ((x * 0.23000001) * (x * 0.23000001)))); printf("Il risultato e':%Lf\n", y); return 0; }
In ogni caso sarebbe meglio modificare la formula in modo da renderla più robusta e meno dipendente da errori. È possibile che il problema nel tuo codice possa essere dovuto ad una qualche opzione di compilazione che favorisce la velocità alla qualità di calcolo.
Si infatti!! Intanto se assegni il valore 0 alla x ti da un bel messaggio di errore per "divisione per zero", quindi questo lo dovresti escludere

Il risultato dato dal C sul mio PC è in accordo con quello di Maple (anche se Maple ha mostrato un numero maggiore di decimali). Ho provato a semplificarla e ho ottenuto:
$(3*10^11*x^2)/(3*10^11*x^2 + 111500000*x^3 - 472589751)$
Si tratta di una formula bruttina. Ma queste sono cose che capitano quando si lavora su dei numeri invece che su delle costanti. Come sono venuti fuori quei numeri che stai usando? Qual'è la formula originale?
$(3*10^11*x^2)/(3*10^11*x^2 + 111500000*x^3 - 472589751)$
Si tratta di una formula bruttina. Ma queste sono cose che capitano quando si lavora su dei numeri invece che su delle costanti. Come sono venuti fuori quei numeri che stai usando? Qual'è la formula originale?
ragazzi ho provato a semplificare ulteriormente(credo)il programma che pare sia giusto nel senso che non mi da errori in compilazione pero il risultato è sempre -2.00000000
perchè non funziona?........... il programmino è questo:
#include
main()
{
long double x;
long double y;
long double z;
long double t;
long double r;
long double s;
long double g;
long double k;
printf("dammi una frequenza");
scanf("%Lf",&x);
y=4,46*x;
z=x*0.0000000001;
t=1/z;
r=y-t;
s=r*r;
g=479610000+s;
k=479610000/g;
printf("il valore della funzione e':%Lf\n",k);
return 0;
}

#include
main()
{
long double x;
long double y;
long double z;
long double t;
long double r;
long double s;
long double g;
long double k;
printf("dammi una frequenza");
scanf("%Lf",&x);
y=4,46*x;
z=x*0.0000000001;
t=1/z;
r=y-t;
s=r*r;
g=479610000+s;
k=479610000/g;
printf("il valore della funzione e':%Lf\n",k);
return 0;
}
Scusa ma quello che hai scritto ora e' differente dal precedente.
Perche' non hai usato proprio questo:
y= 12000.0 / (12000.0 + (4.46 * x - 1.0 / ((x * 0.23000001) * (x * 0.23000001))));
In ogni caso, z dovrebbe essere elevato al quadrato e poi 0.000000001 e' diverso da 0.23000001
le costanti presenti in g e k da cosa derivano, anche se all'atto pratico dovrebbero andare bene lo stesso?
s e' sbagliato, deve essere s=z*z
insomma riguarda bene le suddivisioni che ti sei fatto.
Perche' non hai usato proprio questo:
y= 12000.0 / (12000.0 + (4.46 * x - 1.0 / ((x * 0.23000001) * (x * 0.23000001))));
In ogni caso, z dovrebbe essere elevato al quadrato e poi 0.000000001 e' diverso da 0.23000001
le costanti presenti in g e k da cosa derivano, anche se all'atto pratico dovrebbero andare bene lo stesso?
s e' sbagliato, deve essere s=z*z
insomma riguarda bene le suddivisioni che ti sei fatto.
La formula che ho postato sopra non è comoda per i calcoli perché contiene interi molto alti, se dividi per il termine noto in basso ottieni però una formula abbastanza utilizzabile e usando la regola di horner per la valutazione di un polinomio dovresti anche ottenere un algoritmo abbastanza robusto. La formula che hai scritto adesso non è più quella precedente, come l'hai ottenuta? hai sbagliato i calcoli? Potresti darci la formula originale che forse troviamo il modo di risolvere il problema?
Inizio a pensare che il problema sia però dovuto al compilatore. Le cause potrebbero essere 2: problema nella gestione dei long double oppure problema della gestione di %Lf nella funzione printf. In entrambi i casi prova a passare ai double e dicci se il problema persiste.
Inizio a pensare che il problema sia però dovuto al compilatore. Le cause potrebbero essere 2: problema nella gestione dei long double oppure problema della gestione di %Lf nella funzione printf. In entrambi i casi prova a passare ai double e dicci se il problema persiste.
allora credo proprio di aver sbagliato la formula ieri scusate stavo flippando....la formula è quella della curva di risonanza di un circuito rlc ve la sciverei ma non so come si scrivono le formule qui...
se leggi questo http://www.matematicamente.it/forum/come-si-scrivono-le-formule-asciimathml-e-tex-t26179.html dovresti riuscire a "scrivere" le formule

allora la formula è questa:
P($omega$) =$R^2$/($R^2$ + (L$omega $-1/$omega C )^2)
$R^2$ = 479610000
L = 4.46
C = 0.0000000001
$omega$ = 108070.7873
se avete un'idea su come fare un programmino migliore ditemi pure..
P($omega$) =$R^2$/($R^2$ + (L$omega $-1/$omega C )^2)
$R^2$ = 479610000
L = 4.46
C = 0.0000000001
$omega$ = 108070.7873
se avete un'idea su come fare un programmino migliore ditemi pure..
comunque sono passato ai double e ho ottenuto un valore decisamente molto piu interessante:) mi chiedo se passando ai double dovrei cambiare anche %Lf in qualcos'altro...