La libreria standard C fornisce la famiglia di funzioni round
, lround
e llround
in C99. Tuttavia, queste funzioni non sono conformi allo standard IEEE-754, in quanto non implementano l'arrotondamento del "banchiere" da metà a pari come richiesto da IEEE. L'arrotondamento da metà a pari richiede che il risultato sia arrotondato al valore pari più vicino se il componente frazionario è esattamente 0,5. Lo standard C99 mandati invece mezzo lontano da zero come indicato sul cppreference.comconforme a IEEE-754 round-half-to-even
1-3) calcola il valore intero più vicino to arg (in formato in virgola mobile), arrotondamento casi metà strada lontano da zero, indipendentemente la modalità di arrotondamento corrente.
Il solito modo ad-hoc per implementare arrotondamento in C è l'espressione (int)(x + 0.5f)
che, pur essendo in stretta incorrect IEEE-754 matematica, di solito è tradotto da compilatori nella corretta cvtss2si
istruzioni. Tuttavia, questo non è certamente un presupposto portatile.
Come è possibile implementare una funzione che consente di arrotondare qualsiasi valore in virgola mobile con semantica semipermanente? Se possibile, la funzione dovrebbe basarsi solo sul linguaggio e sulla libreria semantica standard, in modo che possa operare su tipi a virgola mobile non IEEE. Se ciò non è possibile, è accettabile anche una risposta definita in termini di rappresentazioni bit IEEE-754. Si prega di caratterizzare le costanti in termini di <limits.h>
o <limits>
.
Sono conformi allo standard, ma non implementano tutto."Arrotonda al più vicino, si lega da zero" è una delle modalità di arrotondamento IEEE-754. –
IEEE-754 rileva che la modalità di arrotondamento scolastico esiste, ma è intesa solo per i decimali. 'Un'attuazione di questo standard deve fornire roundTiesToEven e i tre arrotondamenti diretti attributi. Un'implementazione in formato decimale di questo standard deve fornire roundTiesToAway come attributo selezionabile per gli arrotondamenti . L'attributo di arrotondamento roundTiesToAway non è richiesto per un'implementazione del formato binario . L'arrotondamento dei legami in pareggio è l'unica modalità portatile (e sensata). – 68ejxfcj5669
Invece di 'round()' guarda 'rint()' usato con una modalità di arrotondamento predefinita di "round to closest or even". – njuffa