Limitazioni di numeri in virgola mobile per quantità monetarie

di il
19 risposte

Limitazioni di numeri in virgola mobile per quantità monetarie

Salve, sto facendo un breve esercizio ma non ne capisco nè il senso nè la traccia nè l'output....
L'esercizio dice: [Nel paragrafo 4.6 abbiamo messo in guardia sull'uso di valori in virgola mobile per quantità monetarie. Provate questo esperimento: ] Create una variabile float con il valore 1000000.00. Poi aggiungete a tale variabile il valore letterale float 0.12f. Stampate il risultato usando printf e lo specificatore di conversione "%.2f". Che cosa ottenete??

Io ho provato così:

#include <stdio.h>
int main (void) {
    float bo = 1000000.00;
    float a = 0.12f;
    float sum = bo + a;
    printf ( "%.2f", sum );
}
con risultato 1000000.12
E fin qui non capisco lo stesso il senso dell'esercizio.
Cambiando la precisione però capita ciò:

#include <stdio.h>
int main (void) {
    float bo = 1000000.00;
    float a = 0.12f;
    float sum = bo + a;
    printf ( "%.4f", sum );
}
con risultato 1000000.1250.
Qui non capisco nemmeno l'output.
Grazie..

19 Risposte

  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    Ho notato che se uso un double il calcolo viene corretto anche con precisione "%.4lf"... Ma come mai con float e 4 cifre decimali viene 1000000.1250? grazie.ciao
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    Studia il formato IEEE 754

    a 32 bit e a 64 bit
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    PENSO CHE (cioè non so ma ipotizzo) sia per il modo in cui vengono usati i bit nell'ambito dei valori in virgola mobile. Con 4 byte, come nei float, i problemi d'arrotondamento iniziano a presentarsi con valori minori rispetto a quel che accade con i double. Però, aumentando i valori, anche i double cominciano a "dare i numeri" con arrotondamenti sempre meno affidabili. Sicuramente c'è qualche modo per aggirare l'ostacolo, ma io non lo conosco. Chissà che qualcuno ci illumini, qui, così imparo qualcosa.
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    @aldobaldo
    In ordine progressivo:
    http://floating-point-gui.de/basic
    https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
    https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    L'ostacolo NON PUO' ESSERE SUPERATO, al piu' se ne possono mitigare gli effetti.
    E' un corso semestrale all'universita' e si chiama Calcolo Numerico, in particolare la parte che riguarda la teoria degli errori.

    Tra l'alyro hai anche un'altro problema:
    una cosa e' il valore in floating point, ed una cosa e' quello che stampi.
    Ad esempio, se il valore e',1.9954, se lo stampi con 2 cifre dopo la virgola, avrai 2.00, con 3 avrai 1.995
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    Grazie, forse l'obbiettivo dell'esercizio era dire che con i float ci sono problemi, appunto, di approssimazione, problema che può verificarsi facilmente con le quantità monetarie... 10,000,000 di $ per esempio.... (il mio contratto dei sogni!!).... Mentre con i double, come avete risposto, il problema si mitiga.
    Grazie.
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    Il problema dei double è identico.
    così come lo è coi long double.
    nella pratica è comune usare funzioni del tipo euro arrotonda() scritte ad hoc ovunque si maneggiato importi numerici.
    è anche comune (meno frequente) usare interi per rappresentare importi monetari a virgola fissa.
    12345 trasformati in fase di stampa in 123,45
    Come accennato molto meno diffusi, si utilizzano quando si hanno quantità davvero elevate di dati e un supporto database rudimentale che usa solo float
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    Infatti, con il double il problema si mitiga SOLO LEGGERMENTE.
    Per lavorare con i soldi, serve lavorare NON con i FLOATING POINT, ma con i FIXED POINT, cioe' dumeri con la virgola con un numero ben definito di cifre decimali.

    Quello che si puo' fare e' usare gli interi e ragionare in termini di CENTESIMI di euro (2 cifre decimali) oppure DECIMILLESIMI di euro (4 cifre decimali).
    Quello che si deve fare, in queto caso, e' implementare una libreria per le 4 operazioni
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    Ah! Collegamenti "massicci" e che non ho certo già letto (e men che meno cercato di ponderare), ma sui quali ritornerò più e più volte perché vorrei capirci ALMENO qualcosina e ALMENO a livello "divulgativo". Prendo nota per le mie lettura di domenica prossima.

    Per ora, in un programmino per la contabilità famigliare, ho affrontato intuitivamente la cosa proprio usando valori interi che rappresentassero non gli euro ma i centesimi. La stessa cosa ho fatto in un altro programmino destinato a immagazzinare e trattare voti scolastici.

    Il metodo funziona anche con tipi non "esosi". Ad esempio, per le somme in centesimi di euro ho usato dei long, considerando che difficilmente la contabilità annua di una famiglia supera i 21.474.836 euro (a meno che si debbano pagare tasse sulla casa, nel qual caso il rischio esiste concretamente ).

    Per i voti invece ho usato dei minuscoli char, perché avendo a che fare con un massimo d'una cifra oltre la virgola la gamma si restringe a 0-100 (0.0-10.0) -- in effetti con i char non credo sia poi così sicuro il "risparmio" in termini di spazio di memoria rispetto al classico int, perché se non erro c'è da tenere in conto la questione del cosiddetto "allineamento" in merito alla quale so di avere parecchie lacune...
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    Ammesso che serva riportarlo qui, ricordo un articolo che lessi in merito allo sviluppo di videogiochi.

    In quell'articolo si osservava come nel calcolare la posizione degli elementi del gioco nello spazio convenisse ripetere per intero i calcoli ogni volta a partire dai dati meno "dinamici", anche se ciò risultava in una piccola perdita di efficienza. La finalità indicata era evitare che l'accumularsi di numerosi arrotondamenti successivi nei calcoli in virgola mobile facesse sì che differenze inizialmente irrisorie "evolvessero" verso errori così palesi da rendere poco godibile o impraticabile il gioco. Nella fattispecie si parlava anche del rischio di far "esplodere" (sì, si usava proprio questo termine, anche se in inglese) i sistemi di simulazione dei fenomeni fisici fino a renderli totalmente irrealistici o, peggio, fino a condurre a perdite di controllo degli elementi del gioco.

    Era un articolo molto intrigante benché "accessibile" anche per i miei livelli di comprensione -- purtroppo non ricordo minimamente dove lo trovai.
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    Grazie a tutti.... ))
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    AldoBaldo ha scritto:


    Ammesso che serva riportarlo qui, ricordo un articolo che lessi in merito allo sviluppo di videogiochi.

    In quell'articolo si osservava come nel calcolare la posizione degli elementi del gioco nello spazio convenisse ripetere per intero i calcoli ogni volta a partire dai dati meno "dinamici", anche se ciò risultava in una piccola perdita di efficienza. La finalità indicata era evitare che l'accumularsi di numerosi arrotondamenti successivi nei calcoli in virgola mobile facesse sì che differenze inizialmente irrisorie "evolvessero" verso errori così palesi da rendere poco godibile o impraticabile il gioco. Nella fattispecie si parlava anche del rischio di far "esplodere" (sì, si usava proprio questo termine, anche se in inglese) i sistemi di simulazione dei fenomeni fisici fino a renderli totalmente irrealistici o, peggio, fino a condurre a perdite di controllo degli elementi del gioco.

    Era un articolo molto intrigante benché "accessibile" anche per i miei livelli di comprensione -- purtroppo non ricordo minimamente dove lo trovai.
    Te lo dico io: sciocchezze.
    O meglio versione per dilettanti (cioè lenti).
    Anche solo il calcolo di una radice quadrata (1/sqrt) è un "mondo" interessantissimo.
    Altro che queste robine!
    Tanto per dare un'idea di come il mondo è "leggermente" più complesso della versione didattica...
    https://www.lomont.org/Math/Papers/2003/InvSqrt.pd
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    Non siamo tutti Sheldon Cooper, e a volte ci accontentiamo di capire almeno le piccole cose.
  • Re: Limitazioni di numeri in virgola mobile per quantità monetarie

    AldoBaldo ha scritto:


    Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!

    Comunque Grazie
Devi accedere o registrarti per scrivere nel forum
19 risposte