Successivo: Funzione random Cliff, Precedente: Funzione assert, Su: Funzioni di tipo generale [Contenuti][Indice]
Il modo in cui printf e sprintf()
(vedi la sezione Usare l’istruzione printf per stampe sofisticate)
effettuano l’arrotondamento spesso dipende dalla subroutine C sprintf()
del sistema. Su molte macchine, l’arrotondamento di sprintf() è
statistico, il che significa che non sempre arrotonda un .5 finale per
eccesso, contrariamente alle normali aspettative. Nell’arrotondamento
statistico, .5 arrotonda alla cifra pari, anziché sempre per eccesso, così
1.5 arrotonda a 2 e 4.5 arrotonda a 4. Ciò significa che se si sta usando un
formato che fa arrotondamenti (p.es. "%.0f"), si dovrebbe controllare
quello che fa il sistema che si sta usando. La seguente funzione esegue un
arrotondamento tradizionale; potrebbe essere utile nel caso in cui
l’istruzione printf
di awk che si sta usando faccia degli arrotondamenti statistici:
# round.awk --- effettua arrotondamento tradizionale
function round(x, ival, aval, frazione)
{
ival = int(x) # parte intera, int() fa un troncamento
# vedere se c'è la parte frazionale
if (ival == x) # nessuna parte frazionale
return ival # nessun decimale
if (x < 0) {
aval = -x # valore assoluto
ival = int(aval)
frazione = aval - ival
if (frazione >= .5)
return int(x) - 1 # -2.5 --> -3
else
return int(x) # -2.3 --> -2
} else {
frazione = x - ival
if (frazione >= .5)
return ival + 1
else
return ival
}
}
# codice per testare, commentato
# { print $0, round($0) }