I bit fanno brutti scherzi
Indipendentemente dal linguaggio di programmazione, il computer può causare delle approssimazioni ai valori frazionari dovute al suo intrinseco limite nella precisione con la quale riesce a trattare internamente l’informazione numerica digitalizzata: il computer infatti lavora con le frazioni binarie e non con le frazioni decimali.
Vediamo un esempio.
set a [expr {10.0/3.0}]
set b [expr {2.0/3.0}]
puts "(10.0/3.0) / (2.0/3.0) is [expr {$a/$b}]"
---
(10.0/3.0) / (2.0/3.0) is 5.000000000000001
Ci saremmo aspettati come risultato il valore 5, ma invece otteniamo una approssimazione indesiderata.
Stiamo quindi sempre molto attenti quando abbiamo a che fare con le frazioni.
Occhio anche ai numeri interi
Dobbiamo anche stare molto attenti alle divisioni tra numeri interi.
Anche qui vediamo un esempio.
puts [expr {1/6}]
---
0
Cosa? Zero! Ma siamo impazziti?
Perché accade questo fenomeno?
Il problema è che nella espressione abbiamo utilizzato soltanto la rappresentazione dei numeri interi. In questo caso l’interprete Tcl cerca di restituire come risultato un numero intero troncando la parte decimale.
Come possiamo evitare il problema?
Per evitare di ottenere approssimazioni non desiderate, occorre fare in modo che in presenza di espressioni che possono causare come risultato dei valori in virgola mobile, si forzi il calcolo utilizzando, per almeno uno dei numeri coinvolti nell’espressione, la notazione con il punto.
puts [expr {1/6.0}]
---
0.16666666666666666
Nel prossimo articolo parleremo della struttura di controllo if-then-else.
