strategie per gestire la macchina epsilon

2

Supponiamo di avere una situazione in cui dividi e quindi moltiplica un float, e devi garantire che sopravviva ai macthps (cioè l'output di moltiplicazione equivale all'ingresso della divisione). Quali sono le strategie conosciute per garantire questo? L'arrotondamento funzionerebbe, ma qualcos'altro?

    
posta jamesson 17.03.2013 - 01:38
fonte

3 risposte

5

Tradizionalmente, moltiplica PRIMA e POI dividi.

Se il tuo hardware e il compilatore sono abbastanza intelligenti, le istruzioni emesse manterranno il risultato della doppia larghezza della moltiplicazione, per l'elaborazione da parte della divisione.

Dividendo prima e poi moltiplicando, non puoi davvero farlo. (Il tuo compilatore potrebbe a quel punto essere abbastanza intelligente da riordinare le operazioni, ma di solito sei più sicuro farlo da solo.)

Leggi Metodi numerici per scienziati e ingegneri di Hamming . All'inizio del libro, entra in un considerevole dettaglio sulla riorganizzazione dei calcoli per ridurre questo tipo di problemi. È disponibile da Dover. (Se la letteratura tecnica è il tuo feticcio, come se fosse mio, Dover è il tuo AMICO!)

    
risposta data 17.03.2013 - 06:53
fonte
2

In realtà questo errore non si verifica solo a causa della moltiplicazione, ma può essere riprodotto in modo più semplice: 0.1 + 0.2

C'è un sito web speciale per questo problema: link

What can I do to avoid this problem?

That depends on what kind of calculations you’re doing.

  • If you really need your results to add up exactly, especially when you work with money: use a special decimal datatype.
  • If you just don’t want to see all those extra decimal places: simply format your result rounded to a fixed number of decimal places when displaying it.
  • If you have no decimal datatype available, an alternative is to work with integers, e.g. do money calculations entirely in cents. But this is more work and has some drawbacks.
    
risposta data 17.03.2013 - 13:00
fonte
0

Non puoi garantirlo. Non mentre usi i galleggianti, comunque. Come dice il commento, se hai bisogno di una garanzia, puoi usare le frazioni di precisione arbitraria.

In generale, l'arrotondamento non offre una tale garanzia, è necessario eseguire alcuni calcoli matematici prima di poter essere sicuri che funzioni nell'intervallo della specifica applicazione.

La vera domanda è: perché pensi di aver bisogno di una garanzia? La tua domanda suggerisce che è necessario, in realtà, dedicare seriamente uno sforzo per considerare questo, perché la sua risposta è probabilmente la parte più rilevante e importante della risoluzione effettiva del problema e non hai fornito informazioni sufficienti per consentire consigli più dettagliati e costruttivi.

    
risposta data 21.03.2013 - 19:54
fonte

Leggi altre domande sui tag