Perché i numeri in virgola mobile sono usati spesso in Scienze / Ingegneria?


33

Mentre indaga l'accuratezza dei numeri in virgola mobile, ho visto in alcuni punti un'affermazione simile a

" float e double sono ( progettati per / usati spesso in ) calcoli ingegneristici e scientifici "

Da quanto ho capito, la forza dei float e dei doppi è la quantità di memoria che usano per la loro (buona, ma non perfetta) precisione.

Mi sembra di capire quasi da questa risposta

"I numeri in virgola mobile consentono di modellare quantità continue"

Non sono ancora convinto di aver capito. L'ingegneria e la scienza sembrano entrambi campi in cui si desidera ottenere risultati precisi dai calcoli che, a mio avviso, i punti fluttuanti non danno. Inoltre, non sono sicuro di seguire esattamente cosa sia una "quantità continua".

Qualcuno può approfondire questa spiegazione e forse fare un esempio?



47
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.Sia in Scienza che in Ingegneria ti preoccupi solo della precisione fino a un certo punto. L'uso della precisione infinita per ogni calcolo è spesso inutilmente costoso. Ciò che distingue il virgola mobile dal punto fisso è che non è necessario impegnarsi in un determinato numero di posizioni decimali: è possibile avere quantità molto piccole con molte posizioni decimali o quantità molto grandi con precisione limitata.
Doval,

24
Per aggiungere ai punti sopra indicati, non solo non ti preoccupi della precisione oltre un certo punto, non puoi ottenere risultati arbitrariamente precisi perché molti dei tuoi input sono misurati quantità che hanno qualche errore intrinseco.

2
Inoltre, sottolinea che non è un dato di fatto che anche gli errori di arrotondamento continueranno ad accumularsi. Dipende da cosa stai facendo e da come lo stai facendo; c'è un intero campo dedicato a questo.
Doval,

10
La virgola mobile non è "precisione casuale", gli errori per varie operazioni sono prevedibili e noti e gli errori per un algoritmo possono essere elaborati. Se sono abbastanza bassi (e in particolare se i tuoi errori all'indietro sono più piccoli delle incertezze nelle variabili di input), puoi essere certo che i tuoi risultati sono buoni (o almeno che eventuali problemi con essi non sono causati dal floating- punto errore).
Hobbs,

Risposte:


77

Il calcolo nella scienza e nell'ingegneria richiede compromessi in termini di precisione, portata e velocità. L'aritmetica a punto fisso fornisce precisione e velocità decente, ma sacrifica la portata. BigNum, librerie di precisione arbitrarie, vincono su distanza e precisione, ma perdono velocità.

Il nocciolo della questione è che la maggior parte dei calcoli scientifici e ingegneristici richiedono alta velocità e una vasta gamma, ma hanno esigenze relativamente modeste di precisione. La costante fisica più ben determinata è nota solo a circa 13 cifre e molti valori sono noti con molta meno certezza. Avere più di 13 cifre di precisione sul computer non lo aiuterà. La mosca dell'unguento è che le sequenze di operazioni in virgola mobile possono perdere gradualmente precisione. Il pane e il burro dell'analisi numerica sta scoprendo quali sono i problemi particolarmente sensibili a questo, e sta scoprendo modi intelligenti di riorganizzare la sequenza di operazioni per ridurre il problema.

Un'eccezione a ciò è la teoria dei numeri in matematica che deve eseguire operazioni aritmetiche su numeri con milioni di cifre ma con assoluta precisione. I teorici dei numeri numerici usano spesso le librerie BigNum e sopportano i loro calcoli impiegando molto tempo.


2
Buona risposta. Mentre le funzioni sottostanti possono essere perfettamente continue, il che richiederebbe una precisione perfetta per modellare esattamente, la realtà è che tutto nella scienza e nell'ingegneria è un'approssimazione. Preferiremmo avere approssimazioni decenti e utili e realizzare qualcosa di infinita precisione, per la quale aspetteremmo per sempre il completamento di molte operazioni.
Jonathan Eunice,

4
@JonathanEunice Non puoi esattamente modellare la realtà. L'input per il modello proviene dalle misurazioni e probabilmente non sarai mai in grado di misurare le cose in modo così preciso che un numero reale nativo nei moderni computer / software (al momento) lo limiterebbe. In altre parole, puoi avere un modello, un software o una matematica perfetti, non importa. Es. Calcola un volume di una scatola. a*b*ccose semplici, tuttavia è necessario misurare le dimensioni che non si possono fare con assoluta certezza, quindi non è comunque necessaria una precisione di calcolo infinita, quel tanto che basta per essere vincolati dall'errore di misura.
luk32,

2
@ luk32 Siamo violentemente d'accordo sulla maggior parte di questi punti. Si può modellare qualcosa esattamente (volume di una sfera, ad esempio), ma non si può mai misurare esattamente. E la realtà non si adatta mai perfettamente a un modello perfetto. Meglio ottenere valori / modelli utili leggermente imprecisi piuttosto che attendere misurazioni o calcoli perfetti - qualcosa che sarà sempre ad un passo.
Jonathan Eunice,

2
"Il nocciolo della questione è che la maggior parte dei calcoli scientifici e ingegneristici hanno bisogno di alta velocità e di un'enorme portata" Se ti do molto tempo, non puoi ancora calcolare esattamente perché gli algoritmi di calcolo esattamente sono ampiamente sconosciuti. E prima di tutto, non possiamo nemmeno rappresentare esattamente i numeri. Questo è solo un problema che non sappiamo risolvere, né rapidamente né lentamente.
Michael Le Barbier Grünewald,

@ MichaelGrünewald, non possiamo rappresentare esattamente i numeri reali, ma siamo in grado di risolvere i problemi con un'approssimazione abbastanza vicina da poter costruire strutture alte circa duemila piedi, identificare i geni nel DNA e incontrare un satellite con una cometa dopo due anni nello spazio. Per parafrasare Randy Newman, potrebbe non essere esatto, ma va bene. In effetti possiamo rappresentare razionali esattamente usando le librerie di precisione arbitrarie (soggette a limiti di memoria).
Charles E. Grant,

30

Quale alternativa proponi?

Le quantità continue sono rappresentate usando numeri reali in matematica. Non esiste un tipo di dati in grado di codificare tutti i possibili numeri reali (poiché i reali non sono numerabili), quindi ciò significa che possiamo scegliere solo un sottoinsieme di quei numeri reali a cui siamo maggiormente interessati.

  • Puoi scegliere tutti i reali calcolabili, il che è simile a quello che fanno i computer algebra systems (CAS). Il problema è che diventa rapidamente irrealizzabile man mano che il tuo albero delle espressioni diventa sempre più grande. È anche molto lento: prova a risolvere simbolicamente un enorme sistema di equazioni differenziali in Mathematica e confrontalo con qualche altra implementazione basata su virgola mobile e vedrai una notevole differenza di velocità. Inoltre, come hanno sottolineato Jörg W Mittag e Kasperd: non hai nemmeno operazioni di uguaglianza / confronto decidibili.

  • Potresti usare numeri razionali esatti, ma ciò non funziona davvero per molte applicazioni perché devi calcolare radici quadrate o coseni o logaritmi ecc. Inoltre, c'è anche la tendenza a rendere i razionali sempre più complessi e quindi richiedere più spazio per memorizzare e tempo di elaborazione mentre esegui sempre più calcoli su di essi.

  • Potresti anche usare decimali di precisione arbitraria, ma anche qualcosa di semplice come la divisione non funzionerà perché ottieni cifre ripetute all'infinito. Puoi anche imbatterti nel problema della crescente complessità mentre esegui più simili ai numeri razionali, anche se in misura minore.

Quindi saresti costretto a usare approssimazioni ad un certo punto, nel qual caso è esattamente dove i numeri in virgola mobile fanno meglio. I numeri a virgola mobile hanno anche una larghezza fissa (a differenza di tutti gli altri 3 tipi di dati menzionati in precedenza), il che impedisce l'aumento della complessità quando si eseguono sempre più calcoli su di essi.


1
Una delle migliori risposte, l'ho trascurata prima di scrivere la mia.
Michael Le Barbier Grünewald,

8
Inoltre, c'è il fatto leggermente scomodo che non si può nemmeno dire se due reali calcolabili sono uguali.
Jörg W Mittag,

1
L'uso di tutti i reali calcolabili non costituirebbe un problema con i confronti? Sono abbastanza sicuro che non puoi confrontare realtà calcolabili arbitrarie senza risolvere il problema di arresto.
Kasperd,

@kasperd: Penso che dipenderebbe in qualche misura dalle operazioni che è stato permesso di usare nel calcolo, anche se non sono sicuro di quanto ricco possa essere un insieme di tipi di calcolo e garantire comunque che due risultati arbitrari che potrebbero essere prodotto in un numero finito di operazioni potrebbe essere confrontato in tempi limitati. I tipi algebrici soddisferebbero quasi sicuramente quel criterio, ma non so se le funzioni ln (x) ed exp (x) possano essere aggiunte e ancora soddisfarle.
supercat,

È possibile supportare l'aritmetica di precisione arbitraria (aggiungere, moltiplicare, sottrarre, dividere), irrazionali (come √2), trascendentali ben noti (come Pi ed e), funzioni trig, ecc. Usando frazioni continue. Vedi l'algoritmo di Gosper in HAKMEM. Al termine, è possibile eseguire una valutazione lenta per ottenere un'approssimazione in virgola mobile alla precisione desiderata.
Paul Chernoch,

14

La tua proposta sulla scienza è sbagliata, ingegneria e scienza diverse dalla matematica non funzionano con risultati esatti e precisi. Funzionano con un fattore di precisione che è incorporato in quante cifre mostri.

Il termine chiave che devi capire qui è: cifre significative . Le cifre significative di un numero sono quelle cifre che portano significato contribuendo alla sua precisione.

Il che significa sostanzialmente che se dichiaro che qualcosa ha una lunghezza di 12 centimetri, può effettivamente essere lungo tra 11,5 e 12,5 centimetri. Se tuttavia dichiaro che qualcosa è lungo 12,00 centimetri, può essere lungo tra 11.995 e 12.005 centimetri.

Proprio come un'illustrazione, se prendi un nastro di misurazione e misuri il tuo salotto. Anche se potresti scoprire che è largo 6 metri e 25 centimetri, sai che la tua misurazione del nastro non era abbastanza accurata da dire qualcosa sulla precisione millimetrica o sulla precisione dei nano-metri.


@leftaroundabout cosa intendi per matematica (come in matematica) non è scienza? Nel mio libro lo è.
Pieter B,

2
@PieterB: la matematica non è scienza. È filosofia. La scienza è l'atto di formare una comprensione del nostro mondo fisico. La filosofia è l'atto di capire come funzionano le idee in un mondo ideale.
slebetman,

Penso che la scienza di solito preferisca lavorare con intervalli di confidenza espliciti piuttosto che cifre significative.
Taemyr,

@slebetman Oltre a questo non ha nulla a che fare con il mio punto nel mio post, se la matematica è una scienza o no non posso fare a meno di citare una citazione: la natura è innatamente matematica e ci parla in matematica. Dobbiamo solo ascoltare. Poiché la natura è matematica, qualsiasi scienza che intenda descrivere la natura dipende completamente dalla matematica. È impossibile enfatizzare eccessivamente questo punto, ed è per questo che Carl Friedrich Gauss ha definito la matematica "la regina delle scienze".
Pieter B,

Quella citazione è di qui . Una buona lettura e molte cose di cui discutere, ma non qui poiché in effetti non ha nulla a che fare con il tuo post o questa domanda.
lasciato il

7

Nota che i numeri in virgola mobile sono sostanzialmente gli stessi della notazione scientifica e ingegneristica , il modo standard per gli umani di scrivere numeri in matematica e scienze. In questi campi, non c'è una grande necessità di estrema precisione, ma spesso c'è una vasta gamma.

Per prendere un esempio casuale dai miei compiti di fisica, di recente ho dovuto lavorare con la massa di un elettrone, che è di circa 9,11 * 10 ^ -31 kg. Non mi interessa molto della precisione; potrebbe facilmente essere 9.12 per quanto mi riguarda. Ma mi importa dell'esponente e non voglio scrivere 0,0000 ... 911 kg, quindi uso la notazione scientifica.

Ragionamenti simili si applicano nel calcolo scientifico e ingegneristico: esiste una vasta gamma, ma non vogliamo archiviare e lavorare con numeri molto grandi, quindi memorizziamo un valore normalizzato e un esponente, che è più piccolo e più veloce con cui lavorare.


6

I numeri a virgola mobile hanno anche diverse proprietà che si prestano bene al calcolo di alcuni tipi di risultati scientifici. In particolare, la precisione è inversamente proporzionale alla grandezza, proprio come nella notazione scientifica, quindi è possibile rappresentare sia piccole differenze vicine allo zero sia differenze maggiori molto più lontane.

Il documento di Goldberg è probabilmente l'analisi più famosa delle proprietà dei numeri in virgola mobile (e dovrebbe essere richiesta la lettura se ti interessa questo genere di cose), ma i documenti di Kahan penso che facciano un lavoro migliore nel spiegare la logica alla base di molti dei sottili problemi di progettazione.

In particolare, la diatriba di Kahan sull'implementazione di Java in virgola mobile , sebbene piuttosto incendiaria, evidenzia diversi aspetti positivi del perché la semantica IEEE-754 è utile, e il Bit di segno di molto rumore per nulla esplora la logica del segno zero in profondità.


Non ho ancora letto l'intero documento di Kahan, ma sembra più gentile di me. Java avrebbe potuto avere valori numerici che erano più utili ed eseguiti più velocemente di quello che effettivamente avrebbe se avesse aggiunto un realtipo che avrebbe memorizzato tre voci dello stack e rappresenterebbe la naturale precisione computazionale della macchina; il valore può essere memorizzato come float a 80 bit + 16 bit che riempie un float a 64 bit + 32 bit di riempimento, o 64 bit mantissa, esponente a 16 bit e 16 bit per segno e flag [per implementazioni non FPU].
supercat,

Specificare quello floate doublesono i formati di archiviazione, ed realè il formato computazionale. In molti sistemi senza FPU, lavorare con una mantissa, un esponente e flag che si trovano su confini di parole e mezze parole sarebbe più veloce che dover decomprimere e reimballare i doppi con ogni operazione.
supercat,

2

TL; DR Non sappiamo come calcolare la maggior parte delle funzioni con precisione perfetta, quindi non ha senso rappresentare numeri con precisione perfetta.

Tutte le risposte finora mancano il punto più importante: non possiamo calcolare i valori esatti della maggior parte dei numeri. Come un caso speciale importante, non possiamo calcolare i valori esatti della funzione esponenziale - per citare solo la funzione irrazionale più importante.

Risposta ingenua alla domanda ingenua

Sembra che la tua domanda sia piuttosto "esistono esatte librerie aritmetiche, perché non le usiamo al posto dell'aritmetica in virgola mobile?" La risposta è che l'aritmetica esatta funziona su numeri razionali e che:

  • Il numero di Archimede - il nome pedante di π - non è razionale.
  • Molte altre costanti importanti non sono razionali.
  • Molte altre costanti importanti non sono nemmeno note per essere razionali o meno.
  • Per qualsiasi numero razionale diverso da zero x il numero exp (x) è irrazionale.
  • Dichiarazioni simili valgono per radicali, logaritmi e una vasta gamma di funzioni importanti per gli scienziati (distribuzione di Gauss, CDF, funzioni di Bessel, funzioni di Eulero, ...).

Il numero razionale è un incidente fortunato. La maggior parte dei numeri non sono razionali (vedi il teorema di Baire), quindi il calcolo dei numeri ci porterà sempre fuori dal mondo razionale.

Cos'è il calcolo e la rappresentazione di un numero?

Potremmo reagire dicendo: "OK, il problema è che i numeri razionali non sono stati un'ottima scelta per rappresentare i numeri reali". Quindi arrotoliamo i nostri fanghi su Debian e escogitiamo un nuovo sistema di rappresentazione per numeri reali.

Se vogliamo calcolare i numeri, dobbiamo scegliere un sistema di rappresentazione per i numeri reali e descrivere operazioni importanti su di essi, ovvero definire cosa significa elaborazione . Poiché siamo interessati al calcolo scientifico, vogliamo rappresentare accuratamente tutti i numeri decimali (le nostre misure), i loro quozienti (numeri razionali), i valori delle funzioni esponenziali e alcune costanti divertenti, come il numero di Archimede.

Il problema è che l'unico modo per rappresentare perfettamente i numeri in un tale sistema è usare la forma simbolica, cioè non calcolare nulla e lavorare con espressioni algebriche. Questa è una rappresentazione piuttosto paralizzata di numeri reali, perché non possiamo confrontare in modo affidabile due numeri (quale è maggiore)? Non possiamo nemmeno facilmente rispondere alla domanda "Il numero dato è uguale a 0?".

Se cerchi definizioni e problemi matematici più precisi, cerca numeri razionali, numeri trascendentali, migliori approssimazioni e il teorema di Baire, per esempio.


Penso che questa sia un'ottima risposta, non solo a questa domanda, nella misura in cui non sono sicuro che il richiedente comprenderà i punti che stai facendo. Questo e tu sei abbastanza indolente con la rappresentazione inesatta di numeri \ Real o \ Complex da parte di una rappresentazione digitale finita (indipendentemente dalla larghezza di bit dinamica o statica). È del tutto vero, ma a parte il punto. Complimenti per il non alleato robotico che cita Goldberg. :) E il teorema di Baire non fa parte della solita retorica che si trova su Programmers o StackOverflow.
mctylr,

0

Perché

1) Gli autori sostengono che "il calcolo ingegneristico e scientifico" misura le quantità fisiche del mondo reale

2) Le quantità fisiche sono continue e esattamente come si afferma "I numeri in virgola mobile consentono di modellare le quantità continue"

.. e il resto della mia risposta è riassunto bene da Rufflewind , quindi non lo ripeterò qui.


0

I numeri in virgola mobile forniscono un'accuratezza relativa: possono rappresentare numeri che sono al massimo una piccola percentuale (se si desidera chiamare qualcosa come 0,0000000000001% una percentuale) lontano da qualsiasi numero preciso su una vasta gamma di numeri. Condividono questo tratto con una regola diapositiva, sebbene quest'ultima non sia migliore di qualcosa come 3 cifre di precisione. Tuttavia, era abbastanza sufficiente per elaborare le forze statiche e dinamiche di grandi strutture prima che i computer digitali diventassero un luogo comune per questo, e questo perché le costanti dei materiali mostrano anche alcune variazioni e la scelta di costrutti ragionevolmente benigni rispetto alle differenze materiali e costruttive tenderà rendere ragionevolmente identificabili i carichi massimi e i punti deboli.

Ora la "precisione" è una funzione utile per molti numeri che rappresentano misurazioni e / o dimensioni di proprietà fisiche.

Non tutto in scienza / ingegneria appartiene a quella categoria. Ad esempio, se si utilizzano trasformazioni teoriche numeriche per moltiplicare numeri grandi o campi di Galois per manipolare polinomi di correzione degli errori, non esiste un piccolo errore: qualsiasi errore a singolo bit durante l'elaborazione porterà a risultati che sono abbastanza indistinguibili da completamente casuali rumore.

Anche in quelle aree si può lavorare con numeri in virgola mobile (come usare FFT complessi per fare la convoluzione) se si tiene traccia dell'accumulo di errori e si assicura che gli errori in virgola mobile non accumulino una grandezza sufficiente per eventualmente anche capovolgere un singolo bit in le entità reali di cui sono approssimazioni. Per tali approssimazioni, l'elaborazione a virgola fissa sarebbe probabilmente più appropriata, ma le unità a virgola mobile nel campo tendono a fornire un funzionamento più rapido e un numero maggiore di bit utilizzabili.

Anche i linguaggi di programmazione come C o Fortran rendono sorprendentemente difficile accedere a operazioni di base come la moltiplicazione e la divisione di precisione mista o un bit di trasporto per addizione / sottrazione, e questi sono elementi costitutivi di base per andare oltre numeri interi di precisione limitata.

Quindi, se riesci a mappare le operazioni su numeri in virgola mobile, tendi ad avere hardware ragionevolmente potente al giorno d'oggi e puoi ragionevolmente specificare i tuoi algoritmi in uno dei linguaggi di programmazione generici di oggi.


0

Penso che si possa rispondere a questa risposta rivolgendosi a quali tipi di applicazioni float/ doubledati non sono adatti.

Quando devi assicurarti di poter rappresentare un numero in modo accurato con un numero specifico di cifre, i numeri in virgola mobile sono inappropriati, perché rappresentano i numeri come potenze di 2, anziché potenze di 10, così come rappresentiamo i numeri in Il mondo reale.

Quindi un dominio in cui i tipi di dati in virgola mobile non devono essere utilizzati è quello della finanza *. Per il sistema centrale, ad esempio di una banca, sarebbe del tutto inaccettabile se un importo che avrebbe dovuto essere $ 100000,01 diventasse improvvisamente $ 100000,00 o $ 100000,02.

Un tale problema potrebbe verificarsi facilmente quando si utilizzano i float, soprattutto se il numero era il risultato di uno o più calcoli, ad esempio il calcolo della somma di tutte le transazioni in un conto.

I calcoli ingegneristici e scientifici sono settori in cui questi errori di arrotondamento relativamente piccoli sono accettabili. Gli utenti sono normalmente consapevoli che tutti i numeri hanno una precisione limitata e spesso lavorano con un numero di cifre significative . Ma soprattutto hanno una precisione relativa ben definita, cioè hanno lo stesso numero di cifre significative, sia per numeri molto grandi, sia per numeri molto piccoli.

* Una volta ho lavorato su un'applicazione finanziaria in cui floats erano stati usati per rappresentare valori e, di conseguenza, sono stati introdotti errori di arrotondamento. Fortunatamente, questo specifico bug non era affatto critico, gli utenti si sono lamentati degli errori di calcolo nel programma. E questo ha portato a un diverso, molto peggio, effetto: gli utenti hanno iniziato a perdere fiducia nel sistema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.