|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
[C] Ma mi fa le operazioni??
Buonasera a tutti, oggi ho scritto per esercizio un programma per il calcolo della radice quadrata e questa è la funzione che fa l'effettivo calcolo della radice:
float Radice (float Num, float N) { float Temp, Scarto, Media; if (0==Num) return (Num); Temp=Num/N; Scarto=Temp-N; Media=((Temp+N)/2); if ((Scarto<Precisione)&&(Scarto>-Precisione)) return (Media); else return (Radice (Num, (Temp+N)/2)); } Num è il numero di qui trovare la radice, N è un numero intero positivo che io ho scelto come 2. Non capisco come sia possibile che Temp sia uguale a Media quando lo scarto è diverso da 0... restituire Temp o resistituire Media è la stessa cosa. Ciao e grazie ![]() Alberto
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Scarto=Num/N-N
Media = ((Num/N + N)/2) = ((Scarto + 2*N)/2) = Scarto / 2 + N Temp = Num/N = Scarto + N Quindi Media = temp se Scarto + N = Scarto / 2 + N...cioè solo se scarto == 0... |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
Invece Media e Temp mi risultano uguali anche se lo scarto è diverso da zero (di poco ovviamente).
Vuoi che ti passi il sorgente? Ciao
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ok...allega... Comunque ricordati che il risultato di sequenze di operazioni diverse floating point che comunque porterebbero ad un risultato equivalente dal punto di vista matematico, possono portare ad un risultato "informatico" diverso...
Per questo lo zero in questi casi praticamente non esiste... Prova ad usare i double e non i float..e vedi se la situazione migliora... |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
Ho provato con i double, ma mi viene tutto un casino, con numeri stranissimi.
Ciao. P.S. Cambia l'estensione del file da .zip a .c ![]()
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ora funziona
![]() Codice:
#include <stdio.h> double Radice (double Num, double N); double Precisione; int main() { float Numero; double Ris; printf ("Inserisci il numero di cui calcolare la radice: "); scanf ("%f", &Numero); Precisione=0.00001; if ((Numero<0)||(Numero>16777216)) { printf ("Numero negativo o troppo grande\n"); system("PAUSE"); return (0); } if (Numero>16392) Precisione=0.0001; if (Numero>1049088) Precisione=0.001; printf ("Temp\t\t Scarto\t\t Media\t\t\n"); Ris=Radice (Numero, 3); printf ("Risultato: %f\n", Ris); system("PAUSE"); return (0); } double Radice (double Num, double N) { double Temp, Scarto, Media; if (0==Num) return (Num); Temp=Num/N; Scarto=Temp-N; Media=((Temp+N)/2); printf ("%f\t %f\t %f \n", Temp, Scarto, Media); if ((Scarto<Precisione)&&(Scarto>-Precisione)) return (Temp); else return (Radice (Num, (Temp+N)/2)); } |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jun 2002
Città: Firenze
Messaggi: 630
|
Quote:
Faccio un esempio: A= 1,0 B= 0,0000000...(tanti zeri)...1 Se calcoli A+B ottieni A+B = 1,0 Perché il singolo numero floating point non ha abbastanza cifre per rappresentare il numero grande e il numero piccolo. ... se poi non è errore di cancellazione, dimentica tutto.
__________________
---> Lombardp CSS Certified Expert (Master Level) at Experts-Exchange Proud user of LITHIUM forum : CPU technology Webmaster of SEVEN-SEGMENTS : Elettronica per modellismo |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
Ci avevo pensato anche io... ma lo scarto era apprezzabile anche con la precisione dei float.
X Cionci, grazie, adesso ci guardo... hai solo modificato float con double ? Ciao
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
Quote:
Indenta in che senso? ![]() Ciao e grazie ancora ![]()
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
![]() ![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
Yes, le rientranze le faccio sui blocchi... qui praticamente non ce ne sono...
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ogni volta che apri una grafa è un nuovo blocco quindi questo codice andrebbe scritto così:
Codice:
double Radice (double Num, double N) { double Temp, Scarto, Media; if (0==Num) return (Num); Temp=Num/N; Scarto=Temp-N; Media=((Temp+N)/2); printf ("%f\t %f\t %f \n", Temp, Scarto, Media); if ((Scarto<Precisione)&&(Scarto>-Precisione)) return (Temp); else return (Radice (Num, (Temp+N)/2)); } Puoi mettere double anche numero, ma devi cambiare la scanf in questo modo: scanf ("%lf", &Numero); |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
Quote:
![]()
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:49.