Altro programmino in c!

qadesh1
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;

}

Risposte
gundamrx91-votailprof
ma hai un errore in compilazione o in esecuzione? Oppure.....???

qadesh1
credo proprio sia in compilazione

gundamrx91-votailprof
e..... qual'e' l'errore??? Anche se un'idea l'avrei..... :D

apatriarca
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.

apatriarca
La riga corretta avrebbe dovuto essere:
y = 12000.0 / (12000.0 + (4.46 * x - 1.0 / ((x * 0.23000001) * (x * 0.23000001))));

qadesh1
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 :(.

apatriarca
Ma cosa stai cercando di fare esattamente?

gundamrx91-votailprof
calcolando a mano, con x=1 il risultato dovrebbe essere 1,0 qualcosa.....

qadesh1
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

gundamrx91-votailprof
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...

apatriarca
A me il risultato viene 1.001205. Sto usando Visual C++ Express. Il programma corretto è
#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.

gundamrx91-votailprof
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 ;)

apatriarca
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?

qadesh1
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;


}

gundamrx91-votailprof
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.

apatriarca
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.

qadesh1
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...

gundamrx91-votailprof

qadesh1
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..

qadesh1
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...

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