Calcolo dei reali: virgola mobile vs TTE vs teoria dei domini vs ecc


19

Attualmente, il calcolo dei reali nelle lingue più popolari viene ancora eseguito tramite operazioni in virgola mobile. D'altra parte, teorie come l'efficacia del tipo due (TTE) e la teoria dei domini hanno da tempo promesso il calcolo esatto dei reali. Chiaramente, il problema della precisione in virgola mobile non si è ridotto di rilevanza, quindi perché queste teorie non sono diventate più mainstream e perché non ci sono implementazioni più cospicue di esse?

Ad esempio, ci sono domini di applicazioni in cui non ci interessa molto degli errori in virgola mobile? Ci sono problemi di complessità significativi?

Risposte:


17

Lavoro nel calcolo dei numeri reali e vorrei sapere la vera risposta. Ma posso speculare. È un problema sociologico, penso.

La comunità di persone che lavorano sull'aritmetica reale esatta è costituita da teorici che non sono abituati a sviluppare software. Quindi di solito relegano il compito di implementazione agli studenti (una notevole eccezione è l' iRRAM di Norbert Müller ), o hanno le loro implementazioni di giocattoli .

Le persone che fanno hanno la programmazione necessaria mojo non hanno il background teorico necessario. Senza una solida base teorica è difficile progettare correttamente l'aritmetica reale corretta. Ad esempio, è un errore aggiungere un sacco di numeri reali in un forciclo, poiché otterrai prestazioni inaccettabili a causa della perdita di precisione. Se vuoi aggiungere un sacco di cose reali, dovresti farlo con una struttura ad albero, tenendo conto delle dimensioni delle somme parziali. Un'altra cosa che è difficile da superare è che <e =poiché la funzione booleana totale sui reali semplicemente non esiste (puoi avere =ma o ritorna falseo diverge e <diverge quando vengono dati due reali uguali).

Infine, non è affatto chiaro che sappiamo come implementare le librerie per un'aritmetica reale esatta. Non sono i soliti pezzi di librerie che definiscono solo alcuni tipi di dati e alcune funzioni su di essi. Spesso l'aritmetica reale esatta richiede speciali modalità di controllo. Ad esempio, iRRAM prende in carico l'esecuzione principale del programma (letteralmente dirotta main), nonché input e output standard, in modo che possa rieseguire il programma quando si verifica una perdita di precisione. La mia biblioteca per la vera aritmetica in Haskell avviene in una Stagedmonade (che è essenzialmente la Readermonade). Molte persone si aspettano che i numeri reali siano "solo un altro tipo di dati", ma ho i miei dubbi al riguardo.


Sono quasi del tutto ignaro dell'esatta aritmetica reale, ma non è possibile implementare la somma Kahan in esso?
jjg

1
Hmm, non credo. Pensa all'esatta aritmetica reale come all'intervallo aritmetico che regola automaticamente la precisione intermedia per ottenere la precisione di uscita desiderata.
Andrej Bauer,

3
Oltre alla mancanza di comprensione da parte dei programmatori sul fatto che i numeri reali sono oggetti infiniti e le sue conseguenze per ciò che può essere fatto a livello di programmazione, penso che anche la mancanza di supporto hardware sia importante. È difficile convincere le persone a usare qualcosa con un notevole dispendio di tempo e memoria solo per correttezza.
Kaveh,

1
Ho visto che c'è qualche attività nell'implementazione del calcolo reale con tipi coinduttivi. Mi sembra che i tipi coinduttivi siano ancora abbastanza difficili da ottenere nel modo giusto (non ne sono certo un esperto), ma pensi che ciò prometta un uso più diffuso del calcolo reale esatto?
SorcererofDM,

3
Qualsiasi implementazione che utilizza flussi di cifre, o qualsiasi altra cosa che abbia un tasso fisso di convergenza, è handicappata sin dall'inizio in quanto converge troppo lentamente. Inoltre, le implementazioni basate sul flusso tendono a costringerti a calcolare tutte le approssimazioni precedenti per ottenere quella successiva, che è anche un errore di progettazione.
Andrej Bauer,

10

In generale, le persone si preoccupano sempre degli errori in virgola mobile. Tuttavia non sono d'accordo con Andrej e non credo che i galleggianti siano preferiti ai reali di precisione arbitrari (per la maggior parte) a causa di ragioni sociologiche.

Credo che l'argomento principale contro il calcolo esatto dei reali sia quello delle prestazioni . Quindi la risposta breve è, ogni volta che le prestazioni sono più importanti della precisione, ti consigliamo di utilizzare numeri in virgola mobile .

L'applicazione che viene in mente è l'uso della fluidodinamica computazionale per progettare l'aerodinamica di auto o aerei, dove piccoli errori di calcolo sono facilmente compensati con i guadagni astronomici dell'utilizzo di unità a virgola mobile dedicate presenti in molti processori diffusi.

In particolare, il problema di rappresentare una vasta gamma di numeri reali utilizzando un numero fisso di bit non è così banale come può sembrare a prima vista. Nella simulazione numerica, i valori possono variare ampiamente (ad es. In presenza di turbolenze), quindi i calcoli a punto fisso non sono appropriati.

Anche quando la precisione non è riparata dall'hardware, l'utilizzo di numeri di precisione arbitrari può essere più lento di diversi ordini di grandezza rispetto all'utilizzo di numeri in virgola mobile. In effetti, anche nel bel caso in cui tutti i numeri sono razionali, operazioni semplici come invertire una matrice possono comportare denominatori grandi e difficili da controllare (vedere qui per un esempio). Molti pacchetti di ottimizzazione lineare di grandi dimensioni utilizzano punti mobili con modalità di arrotondamento appropriate per trovare soluzioni approssimative a causa di questo problema esatto (vedere ad esempio la maggior parte dei programmi trovati qui ).


1
ci sono spazi comprovati tra qualche forma di calcolo reale esatto e calcolo in virgola mobile?
SorcererofDM,

1
Non che io sappia, ho paura. Sean Gao ha alcuni risultati interessanti sulla complessità delle procedure di decisione approssimative sui reali (vedi il suo abstract di tesi ) e ovviamente il denominatore nell'inverso di una matrice cresce nel peggiore dei casi come il suo determinante .
cody

-6

π

Il mio punto è che se hai intenzione di calcolare esattamente, devi avere segnaposto per i nomi speciali e i nomi familiari dei naturali. Ad un certo punto vorrai approssimare il valore esatto per applicarlo a qualcosa nel mondo reale. A quanto pare, è molto più efficiente affrontare l'intero problema come approssimazioni dall'inizio, a meno che tu non abbia esigenze molto specializzate.

R

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.