Buongiorno a tutti
Volevo chiedervi aiuto per capire alcune righe di uno sketch per l'uso dei numeri in virgola mobile che ho trovato su un testo, dove purtroppo la spiegazione non è molto chiara, ed è piuttosto sintetica.
Ci sono alcune righe che non mi sono molto chiare, sia a livello di linguaggio di programmazione, sia a livello matematico.
Lo sketch è questo:
/* Esempio di numeri in virgola mobile
* Questo sketch inizializza un valore float a 1 .1
* Riduce ripetutamente il valore di 0.1 fino a che non diventa 0
*/
float value = 1.1;
void setup()
{
Serial.begin(9600);
}
void loop()
{
value = value- 0.1; // riduce il valore di 0.1 a ogni passaggio
if( value == O)
{
Serial.println("The value is exactly zero");
}
else if(almostEqual(value, O))
{
Serial.print("The value ");
Serial.print(value, 7); // stampa fino a 7 cifre decimali
Serial.println(" is almost equal to zero, restarting countdown");
value = 1.1;
}
else
{
Serial. println(value);
}
delay(250);
}
// restituisce true se la differenza tra a e b è piccola
bool almostEqual(float a, float b)
{
const float DELTA = .00001; // la differenza massima per cui i valori sono quasi uguali
if (a == O) return fabs(b) <= DELTA;
if (b == O) return fabs(a) <= DELTA;
return fabs((a - b)/max (fabs(a), fabs(b))) <=DELTA;
}
La funzione che non capisco è questa
bool almostEqual(float a, float b)
{
const float DELTA = .00001; // la differenza massima per cui i valori sono quasi uguali
if (a == O) return fabs(b) <= DELTA;
if (b == O) return fabs(a) <= DELTA;
return fabs((a - b)/max (fabs(a), fabs(b))) <=DELTA;
}
Ho poca esperienza di tipi di dato bool,ma deduco che la funzione debba restituire 1 o 0.
Le due righe condizionali if mi sono chiare fino alla restituzione del valore assoluto di a o b , ma non mi è chiaro il significato della costante "<= DELTA" subito dopo. A livello di programmazione come si possono spiegare queste due righe ?
Dopodichè l'ultima riga return fabs?
Se non ho capito male, viene effettuata la sottrazione tra float a, e float b, che sarebbero value , e 0 giusto?
dopodiche si divide il valore tra il max dei due parametri float a e b.... ma poi il <=DELTA?
E' la condizione che detrmina il bool di uscita della funzione. Se il valore delle operazioni precedenti è minore o uguale a DELTA, la funzione ritornerà true, altrimenti false.
Come mai le macro sono sconsigliate? Non sono pratico di macro!
Sto imparando il C da quando mi sono appassionato ad Arduino e ho ancora parecchie lacune!
hai provato a far girare il programma?...se si cosa ti stampa sul seriale?...hai notato che uno dei Serial.println() non viene eseguito?...questa, secondo me, è la prima cosa da notare!
Sul testo spiega il perchè non viene stampato un Serial.println.
Deduco tu intenda quello riferito al valore esatto a zero.
Come in matematica ,un valore float non è mai esattamente a zero, ma viene approssimato, e quindi il programma passa alle funzioni successive.
Credo sia per questo
ok...nel codice che hai postato non trovo dove dice che salta il "The value is exactly zero" ma fa lo stesso.
secondo punto...per come è strutturato il programma la funzione "almostEqual" ritornerà sempre il valore del secondo confronto.
if (b == 0) return fabs(a) <= DELTA;
il "<=" è un confronto e torna "true" o "false" a seconda se il numero alla sua sinistra è minore o uguale o maggiore rispetto al valore alla sua destra.
per capire l'ultima riga della funzione dovresti aver presente cosa fanno le funzioni "fabs" e "max" (non vorrei sbagliare ma anche max() qui è una funzione)...e quindi semplice prova con carta e matita per simulare il confronto.
si hai ragione, spiega anche che in questa condizione restituirà sempre un risultato dettato dalla seconda riga di codice.
per l'ultima riga proverò a fare un pò di conti a mano tanto per rendermi conto.