martedì 20 settembre 2022

Minuzie sugli arrotondamenti

Nei giorni scorsi, mentre ero impegnata nello sviluppo di codice in TestStand, mi sono scervellata a lungo – il collega con cui collaboro più assiduamente avrebbe fatto lo gnorri, o magari non si sarebbe proprio accorto di nulla, ma per fortuna/purtroppo io sono fatta in un altro modo ;-) – per cercare di capire come mai certi numeri non venissero arrotondati nella maniera che mi sarei aspettata. Ad esempio come mai il numero 0,245, se scelgo di visualizzare due cifre dopo la virgola, viene arrotondato per difetto a 0,24? Secondo la regola illustrata nell'immagine che apre il post, non dovrebbe essere arrotondato per eccesso a 0,25, dal momento che la cifra successiva è (maggiore o) uguale a 5?

La spiegazione l'ho trovata nell'articolo LabVIEW Standard for Rounding Numbers (Standard LabVIEW per l'arrotondamento dei numeri) della knowledge base di NI; è vero che si riferisce a LabVIEW, ma evidentemente pure TestStand, altro software prodotto da NI, si conforma al medesimo standard.

Quando un numero in virgola mobile viene convertito in un intero, viene arrotondato all'intero più vicino. L'unica eccezione sono i numeri esattamente a metà strada tra due interi, come 2,5, 3,5, ecc. In questo caso il numero viene arrotondato all'intero pari più vicino [round half to even, anche detto "arrotondamento del banchiere", spiegato bene in questo documento, NdC]. Ad esempio 2,5 sarebbe arrotondato a 2, e 3,5 sarebbe arrotondato a 4. Questo è coerente con lo standard IEEE 754.
Il motivo per cui LabVIEW utilizza questa convenzione si basa sull'analisi statistica. Se un grande gruppo di numeri casuali viene arrotondato per eccesso, viene introdotto un errore statistico. Usando la convenzione pari/dispari, tale errore viene ridotto in base al fatto che, in un grande gruppo di numeri casuali, di solito c'è un rapporto ravvicinato di numeri pari e dispari. Se quel rapporto è esattamente 1:1, l'errore viene completamente eliminato. Ad esempio, se sommi 4,5 e 5,5, il risultato è 10. Se li arrotondi all'intero più vicino usando il metodo di arrotondamento per eccesso e poi li sommi, il risultato è 11. Ma, se usi la convenzione dispari/pari e poi li sommi, il risultato è 10. L'utilizzo della convenzione di arrotondamento per eccesso in questo esempio introduce un errore del 10%.

Nessun commento:

Posta un commento