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) }