Perché il float è il default nella maggior parte delle lingue?

2

Nei linguaggi di programmazione, per rappresentare i numeri hai (principalmente) due tipi: Int(s) e floats .

Il valore di Int è molto semplice. Tuttavia i float causano molte sorprese inaspettate:

link

Mi chiedo perché non si usi un tipo decimale che abbia più senso come valore predefinito per valori letterali e matematica normale?

Dove la matematica normale è più precisa?

    
posta mamcx 24.08.2013 - 21:57
fonte

3 risposte

6

Le lingue che utilizzano una singola rappresentazione di numeri sono relativamente rare. Come ho digitato staticamente, posso solo pensare ad alcune varianti di base, e anche nel regno dinamicamente tipizzato so di più che usano almeno interi e float di un formato univoco. Quelli che sono arrivati relativamente tardi nel gioco e la scelta del punto di virgola mobile è probabilmente il risultato del fatto che il punto di virgola mobile era già disponibile nell'hardware e come tipo nella lingua di implementazione del loro interprete.

Ora, perché il virgola mobile binario è diventato il metodo di scelta per la modellazione dei tipi di numeri reali?

Se vuoi che un tipo modellino i numeri reali mentre usi una dimensione costante di poche parole, puoi scegliere tra numeri a virgola fissa e virgola mobile. Altri tipi di rappresentazione per i numeri razionali (punto fisso e punto mobile sono in grado di rappresentare solo il numero razionale e pochi altri valori come gli infiniti - che non sono numeri reali BTW) esistono ma sono meno utili.

Le rappresentazioni a punti fissi hanno alcuni vantaggi, ma hanno un grosso problema: non c'è un buon valore predefinito per il numero di cifre dopo il punto, quindi tutte le lingue e le librerie che le forniscono chiedono al programmatore di scegliere nel contesto della loro applicazione .

Le rappresentazioni a virgola mobile non hanno questo problema: una volta fissata la dimensione, puoi creare una ripartizione tra il significato (spesso impropriamente chiamato la mantissa) e l'esponente abbastanza buono da consentire di personalizzarlo con più problemi di risolverebbe.

Ci si potrebbe chiedere perché uno abbia scelto un formato in virgola mobile binario (BFP nel seguito della discussione) invece di un decimale. Il floating point decimale (DFP) ha un vantaggio uno (e nessuno più) rispetto al binario: può rappresentare esattamente la costante reale di quando li scriviamo di solito, in decimali. Tutti gli altri problemi di BFP sono anche problemi di DFP, ma possono essere nascosti per calcoli abbastanza semplici dal vantaggio sopra (ottieni il risultato esatto perché il calcolo è così semplice che tutti i risultati - finale e intermedio - sono esattamente rappresentabili) .

DFP presenta alcuni svantaggi. Alcune proprietà dei numeri reali sono anche proprietà di BFP, ma non di DFP (la più ovvia è che (a + b) / 2 può essere al di fuori dell'intervallo chiuso [a, b] con DFP) e per questo e per qualche altro ragioni, l'analisi delle proprietà numeriche degli algoritmi è più difficile per DFP che per BFP. Peggio ancora, il limite di errore ottenibile con DFP è peggiore di quello ottenibile con BFP per una determinata dimensione di rappresentazione. Implementare DFP è più difficile che implementare BFP (non tanto che al giorno d'oggi abbia una certa importanza, ma è stato un fattore - sia di complessità che di prestazioni ottenibili - quando è stata impostata la tendenza). Infine per il calcolo scientifico - storicamente il principale consumatore di FP - il vantaggio di DFP non è pertinente, mentre tutti i suoi svantaggi sono.

Quindi hai ottenuto BFP nell'hardware perché era quello che le persone volevano che FP voleva, e sebbene alcune definizioni linguistiche consentano DFP, le implementazioni raramente usano la possibilità e preferiscono usare ciò che l'hardware fornisce.

    
risposta data 24.08.2013 - 22:56
fonte
2

Le lingue usano numeri in virgola mobile binari perché è quello che di solito fornisce l'hardware. Pochissime CPU hanno istruzioni per la gestione dei numeri decimali in virgola mobile e l'adozione di IEEE 754 sembra aver fissato la decisione per il futuro.

    
risposta data 25.08.2013 - 00:14
fonte
1

I numeri in virgola mobile sono un compromesso tra precisione e accuratezza . Sono notevoli per la loro capacità di gestire intervalli numerici molto ampi, con una ragionevole accuratezza. Sono quindi considerati un tipo "taglia unica".

Se prendi un numero in virgola mobile e vincola il suo intervallo a quei numeri che possono essere rappresentati dalla mantissa , puoi trattarlo come un numero intero per scopi di precisione (in altre parole, non otterrà la stranezza che normalmente otterresti dai float, puoi confrontarli esattamente in un'istruzione if , ad esempio).

Questo è perché Lua ha scelto un punto mobile come tipo di dati predefinito; in un certo senso, puoi ottenere il meglio da entrambi i mondi.

Vedi anche
Come gestisce i numeri interi e float di Lua?

    
risposta data 24.08.2013 - 22:08
fonte