Perché il numero intero più comune è 32 bit, ma il numero in virgola mobile più comune è 64 bit?

6

Venendo da uno sfondo Java e C #, ho imparato a usare int (32 bit) ogni volta che ho bisogno di un numero intero e double (64 bit) quando si tratta di valori frazionari. La maggior parte dei metodi dai rispettivi framework (JVM e .NET) di solito si aspettano questi due tipi.

La mia domanda è: perché non usiamo sia long che double per consistenza? So che avere 64 bit di precisione in interi non è necessario la maggior parte del tempo, ma di nuovo, di solito non abbiamo bisogno di 64 bit di precisione nei numeri in virgola mobile, o no?

Qual è il ragionamento alla base di questo, se esiste?

    
posta Arturo Torres Sánchez 23.12.2015 - 19:56
fonte

3 risposte

5

Intervallo rispetto a Precisione

Una cosa è che contesterei l'idea che il numero in virgola mobile più comune utilizza una rappresentazione DPFP a 64-bit (precisione a virgola mobile).

Almeno in campi in tempo reale critici per le prestazioni come i giochi, SPFP (punto di virgola mobile a precisione singola) è ancora molto più comune, poiché l'approssimazione e la velocità sono preferibili alla massima precisione.

Tuttavia forse un modo per vedere questo è che un int a 32 bit rappresenta un intervallo di 2^32 interi (~ 4,3 miliardi). L'uso più comune di numeri interi probabilmente sarà come indici agli elementi, ed è una gamma di elementi piuttosto salutare che sarebbe difficile superare senza superare la memoria disponibile con l'hardware di oggi *.

* Si noti che possono verificarsi errori di memoria insufficiente durante l'allocazione / accesso a un blocco contiguo di 4 gigabyte, anche con 30 gigabyte gratuiti, ad es. a causa dei requisiti di contiguità di quel blocco.

Un numero intero a 32 bit non è sempre più efficiente a livello di istruzione, ma tende a essere generalmente più efficiente quando aggregato in un array, ad esempio, poiché richiede metà memoria (più indici che possono essere contenuti in un singolo pagina / riga cache, ad es.)

Si noti inoltre che come Lightness Races in Orbit indica, non è necessariamente vero da un punto di vista generale che gli interi a 32 bit siano più comunemente usati. Ho la mia prospettiva ristretta che proviene da un campo in cui il 32% diints è spesso aggregato da centinaia di migliaia a milioni come indici in un'altra struttura: lì il dimezzamento delle dimensioni può essere di grande aiuto.

Ora DPFP a 64 bit potrebbe essere usato molto più degli interi a 64 bit in alcuni contesti. I bit extra aggiungono precisione piuttosto che intervallo . Molte applicazioni possono richiedere precisione, o almeno avere una programmazione temporale molto più semplice con una maggiore precisione disponibile. Ecco perché probabilmente i DPFP a 64 bit potrebbero essere più comuni degli interi a 64 bit in alcune aree e perché int potrebbe ancora essere a 32 bit in molti scenari anche su piattaforme a 64 bit.

    
risposta data 23.12.2015 - 20:07
fonte
3

Bene, int e double è una cosa Java. Ad esempio, in Objective-C e Swift si usa NSInteger o Int, che è 32 bit su una macchina a 32 bit e 64 bit su una macchina a 64 bit. Abbastanza grande da contare un numero qualsiasi di oggetti che potrebbero essere in memoria. Ciò che è decisamente utile è usare lo stesso tipo quasi ovunque, a meno che in una particolare situazione sia necessario qualcos'altro.

Java cerca di avere il codice che esegue lo stesso su qualsiasi implementazione, quindi pensano che dovresti usare lo stesso tipo indipendentemente dalla macchina che stai usando, e che il tipo dovrebbe avere lo stesso numero di bit indipendentemente dalla macchina. Objective-C e Swift (e C, C ++ pure) hanno un diverso punto di vista.

I numeri interi sono principalmente usati per contare le cose, e di solito non si hanno molte cose da contare. L'aritmetica in virgola mobile ha bisogno di precisione, e il punto in virgola mobile a 32 bit spesso non ti dà abbastanza precisione. Usare il doppio a 64 bit dappertutto ti dà la possibilità di avere sempre abbastanza precisione, senza essere uno specialista dell'aritmetica a virgola mobile. float no.

Ma quale consistenza usarebbe a lungo e in doppio? Numeri interi e numeri in virgola mobile non sono la stessa cosa. Non è necessario che abbiano dimensioni di bit coerenti. Io uso molto i punti e i rettangoli 2D. Quindi per coerenza, dovrebbero anche essere 64 bit? Punti con 32 bit per componente e rettangoli con 16? Ovviamente no. Nessuna coerenza necessaria.

    
risposta data 23.12.2015 - 21:11
fonte
2

breve, int, singolo e doppio hanno le stesse dimensioni in java come nei più comuni compilatori C per piattaforme a 32 e 64 bit e C come java considera chiaramente int come il tipo intero principale e il doppio da essere il principale tipo di floating point. Penso sia ragionevole affermare che Java abbia ereditato questa convenzione dai comuni compilatori C al momento.

I numeri interi in genere vengono utilizzati per il conteggio o l'indicizzazione di materiale. È piuttosto raro (anche se non mai sentito) di dover contare o indicizzare più di 2 miliardi di qualcosa. Anzi, prima del C99 dovevi usare tipi specifici del fornitore se volevi un numero intero a 64 bit.

I numeri in virgola mobile vengono usualmente usati come un'approssimazione dei numeri reali. La precisione singola è sufficiente per la maggior parte del tempo, ma non è difficile trovare problemi laddove causa un errore di arrotondamento inaccettabile. Mi aspetto che la domanda proveniente dal calcolo scientifico sia ciò che ha spinto il supporto in virgola mobile a doppia precisione a essere onnipresente molto prima che il supporto integer a 64 bit fosse.

Quello che trovo curioso è che C sembra incoraggiare l'uso del doppio, mentre Fortran sembra incoraggiare l'uso della precisione singola.

    
risposta data 24.12.2015 - 04:10
fonte

Leggi altre domande sui tag