Perché usiamo ancora i float? [duplicare]

30

Capisco perché i float hanno avuto uno scopo in passato. E penso di poter capire perché sono utili in alcuni esempi di simulazione oggi. Ma penso che questi esempi siano più eccezionali del comune. Quindi non capisco perché i float siano più prevalenti nelle simulazioni semplici piuttosto che negli interi di precisione molto elevata.

Un argomento classico è che i float forniscono un intervallo più ampio, ma gli integer ad alta precisione possono ora affrontare questa sfida. Ad esempio: con i moderni processori a 64 bit, possiamo eseguire calcoli integer veloci fino a 2 ^ 64. Il sistema solare ha poco meno di 10 miliardi di km di larghezza. 10 miliardi di km divisi per 2 ^ 64 è di circa 5 micron. Non è in grado di rappresentare la posizione all'interno del sistema solare per la precisione di un mezzo capello umano?

Sul rovescio della medaglia, gli errori di arrotondamento dai calcoli fluttuanti possono presentare problemi. È necessario considerare la scala dei calcoli per accertarsi di non introdurre inavvertitamente errori nella simulazione.

Quindi perché i personal computer hanno addirittura bisogno di FPU? Perché non lasciare i float ai supercomputer?

    
posta Boumbles 16.01.2014 - 21:59
fonte

11 risposte

43

La tua argomentazione contro i numeri in virgola mobile è molto fragile, probabilmente a causa dell'ingenuità. (Senza offesa qui, trovo che la tua domanda sia in realtà molto interessante, spero che la mia risposta sarà anche.)

A classic argument is that floats provide a greater range, but high precision integers can meet this challenge now. For example: with modern 64-bit processors, we can do fast integer calculations up to 2^64. The solar system is a little less than 10 billion km in width. 10 billion km divided by 2^64 is about 5 microns. Isn't being able to represent position within the solar system to the precision of half a human hair enough?

Sembra che tu abbia fatto una dichiarazione implicita, secondo la quale una volta che lo sapremo la scala del nostro problema, possiamo usare l'aritmetica punto fisso con rispetto a questa scala per risolvere quel problema.

A volte, questo è un approccio valido, e questo è quello scelto da Knuth implementa calcoli a distanza in TeX. Cosa rende l'uso di aritmetica del punto fisso pertinente in questo caso è tutto le quantità che appaiono all'interno di un calcolo sono numeri interi o distanze si verificano in un problema di composizione tipografica. Perché il campo delle applicazioni è così stretto, ha senso scegliere una lunghezza unitaria molto piccola, molto più piccolo di quello che l'occhio umano può percepire e convertire tutti quantità in multipli di questa unità. Questo porta a un risultato molto importante: nei problemi tipografici che si basano su questa rappresentazione di numeri, non è mai necessario moltiplicare due lunghezze insieme, in modo che non si verifichino perdite di precisione causate da moltiplicazioni nell'aritmetica del punto fisso.

La maggior parte delle volte, è comunque un approccio terribile, eccone alcuni ragioni per cui:

  1. Esistono costanti fisiche e non puoi sempre adattare le loro unità in modo sensato.

    Considera le impostazioni del tuo sistema solare. La costante gravitazionale è 6,67 × 10-11 N · (m / kg) 2, la velocità della luce è 3,00x10 + 5 m / s, la massa del Sole è 1.9891 × 10 + 30 kg e la massa della Terra è 5,97,219 mila × 10 + 24. Nella tua impostazione del punto fisso, non sarai in grado rappresentare la costante gravitazionale con una precisione soddisfacente. Quindi cambierai l'unità. Ma così facendo, devi sostituire ogni numero che sostituisce quantità note e familiari, per criptico valori. Inoltre, è molto probabile trovare un sistema per rappresentano in modo appropriato tutte le costanti di cui hai bisogno potrebbe non essere nemmeno possibile. Pensa ai fisici quantici che funzionano con particelle infinitamente piccole la cui velocità è vicina alla velocità della luce.

  2. Esistono costanti matematiche senza unità.

    Il valore di Pi 3,1415 (fino al 4 ° decimale) senza alcuna unità collegata. C'è in realtà un sacco di costanti utili simili che non possono essere accuratamente rappresentato in un sistema arbitrario a punti fissi. Nel impostazione del sistema solare che hai descritto, possiamo rappresentare Pi con 6 posizioni decimali, che dà una precisione terribile quando si calcola la circonferenza di un'orbita del pianeta, per esempio.

  3. In un sistema a punti fissi, dobbiamo conoscere in anticipo la dimensione di la quantità che stai calcolando.

    Supponiamo che non conosciamo ancora il valore della costante gravitazionale. Noi vorremmo fare un sacco di misure e scrivere un programma per computer per trovare un'approssimazione di quello costante. Sfortunatamente, nel setting del sistema solare che hai descritto, il gravitazionale la costante è rappresentata da 0, che dovrebbe essere il risultato, piuttosto inutile, del nostro calcolo.

  4. Alcune funzioni matematiche non funzionano bene con una precisione fissa aritmetica, a causa del loro tasso di crescita.

    I più importanti sono l'esponenziale e la funzione gamma, che praticamente significa che ogni programma che funziona con qualcosa di diverso dai polinomi sarà difettoso.

  5. Nell'aritmetica in virgola fissa, è molto difficile moltiplicare e dividere numeri correttamente.

    Questo perché se non conosciamo a priori la dimensione dei numeri, non possiamo dire se il loro prodotto si adatta alla rappresentazione. Cioè, dovremmo controllare manualmente per underflow di precisione prima di ogni moltiplicazione.

Conclusione

Mentre la conclusione della tua domanda implica che l'aritmetica in virgola fissa potrebbe essere sufficiente per calcoli polivalenti e quel punto variabile l'aritmetica dovrebbe essere riservata ai supercalcolatori, è proprio il converse che è vero: l'aritmetica in virgola mobile è molto buona e strumento molto sensibile per calcoli per tutti gli usi, mentre punto fisso andrà bene solo in casi molto specifici e ben analizzati.

    
risposta data 17.01.2014 - 13:40
fonte
24

Perché il passaggio a numeri interi non risolve nulla. Il problema con i float non è che hanno inesattezze, è che metà delle persone che li usano non prestano attenzione a quello che sta succedendo. Quelle stesse persone non presteranno la giusta attenzione alle unità che usano quando usano un numero intero, e si verificherà un diverso gruppo di fallimenti.

Ripeti dopo di me: non c'è un proiettile d'argento.

    
risposta data 16.01.2014 - 22:28
fonte
21
  1. Le caratteristiche fisiche dell'universo (come il numero di atomi al suo interno) non sono utili per determinare i limiti delle dimensioni dei numeri, poiché esistono calcoli utili usando numeri con intervalli più ampi.

  2. I numeri in virgola mobile sono un compromesso tra precisione e intervallo. Esprimono deliberatamente un po 'di precisione per ottenere un raggio maggiore.

risposta data 16.01.2014 - 22:05
fonte
14

Poiché la maggior parte dei processori che usi nella tua vita di tutti i giorni sono non processori moderni a 64 bit con calcoli pazzeschi di interi veloci o un'abbondanza di spazio. La maggior parte dei tuoi processori sono dispositivi a 8-16 bit che funzionano come la tua auto, microonde o orologio.

Inoltre, cosa succede quando hai bisogno di parlare di una metà di un'unità, come una metà di un gallone o una metà di un capello umano? I numeri interi sono fantastici, ma poi finisci per parlare in notazioni come 6.4216 × 10 30 che, sebbene accurate, non sono come pensano naturalmente gli umani.

    
risposta data 16.01.2014 - 22:06
fonte
10

L'uso di un float invece di un intero di alta precisione (con conversioni!) è semplicemente più facile e veloce . Posso digitare

float myVar = 0.15; //my value...

e passiamo al resto della logica della mia simulazione. Non devo sprecare altro tempo a pensare alla conversione in int e ad assicurarmi che tutte le mie bilance siano corrette.

E i risultati finiscono per essere abbastanza buoni. Sarò felice di scambiare la velocità di sviluppo con livelli ridicoli di presunta precisione relativa all'interno del mio lavoro.

    
risposta data 16.01.2014 - 22:14
fonte
10

Sto lavorando a un rapporto mentre scrivo questo. Uno dei campi è un long millisecondi di durata che ho ricevuto da qualche altra parte. Questo verrà inviato a Microsoft Excel e le unità di durata che utilizza sono giorni decimali ( 1.25 = 1 giorno, 6 ore).

Certo, puoi suddividere un intervallo dal valore più basso possibile al più grande e avere unità intere che si spostano tra di loro, ma questa è una unità scomoda davvero con cui lavorare nella maggior parte dei casi.

Ci sono tre volte che entrano in gioco quando si lavora con i computer:

  1. Tempo necessario per il codice
  2. Tempo necessario per eseguire
  3. Tempo necessario per mantenere

Quando si lavora con numeri interi piuttosto che in virgola mobile, si fanno trading i tempi 1 e 3 per il tempo 2 per correre più velocemente. Ma ecco la cosa ... non ho bisogno di per correre veloce.

Se c'è un errore di arrotondamento nel decimo decimale nel calcolare un tempo decimale, sono frazioni di secondo di cui non mi importa (il rapporto è HH:MM:SS - non HH:MM:SS.000 ). Non si arrotondano a ciò che sto trattando o presentando. Il punto in virgola mobile è abbastanza buono.

Calcolando l'area di un cerchio per un grafico o dove pi trova la sua strada in probabilità con solo interi è non divertente . Pi è non 3.

È anche più veloce per farmi lavorare con virgola mobile in molti posti. 1.5 è 1.5 not (15 con una scala di 1). Così posso scrivere il mio codice più velocemente e la persona che lo gestisce può leggerlo più velocemente e lavorare con esso.

Se hai bisogno di usare la precisione a punto fisso (denaro) o matematica pura per accelerare determinate applicazioni (simulando galassie in collisione e bombe nucleari), usa tutti i mezzi. Ma per la maggior parte delle cose, il virgola mobile va bene se non stai davvero affrontando quelle situazioni specializzate.

Sta funzionando solo con una estremità della scala. I numeri che possono essere suddivisi tra 0 e 2 64 (o comunque molti bit che stai usando). 2 64 è di circa 10 19 . Ma cosa succede se hai bisogno di lavorare con 10 20 o 10 200 ? Ci sono problemi che funzionano in questo dominio che non sono limitati ai super computer. Ci sono volte in cui le normali simulazioni e giochi usano i float - spesso a causa di restrizioni sulla libreria, ma li usano anche lì. A volte è più semplice.

Riferito a gamedev.SE: Informazioni sulla precisione in virgola mobile e perché la utilizziamo ancora

    
risposta data 16.01.2014 - 22:34
fonte
5

Perché i programmatori usano ancora i float? Alle (generalmente buone) risposte che sono già qui, vorrei aggiungere:

Poiché la maggior parte dei linguaggi di programmazione non fornisce un tipo "decimale", o almeno non rende conveniente lavorare con un float. Se sono integrati nella lingua e sono comodi da utilizzare, i numeri decimali arbitrari di precisione sono molto più intuitivi e più facili da utilizzare rispetto ai numeri in virgola mobile binari, che danno risposte divertenti quando si tenta di calcolare cose come 0.3 - 0.2 .

Sì, puoi utilizzare numeri interi come numeri decimali a virgola fissa. Addizione e sottrazione funzionano bene, ma sono necessari passaggi aggiuntivi quando si fa moltiplicazione / divisione (il risultato deve essere spostato su / giù). Potrebbe aver guadagnato qualche prestazione 15 o 20 anni fa, ma sulle CPU di oggi, indovina un po '? Usare solo i float è più veloce. In realtà, l'aritmetica in virgola mobile è talvolta persino più veloce dell'aritmetica integer !

    
risposta data 17.01.2014 - 00:57
fonte
5

Perché a volte anche un numero intero a 64 bit non ti offre un intervallo sufficiente.

Ad esempio, nel codice della fisica al momento sto lavorando, ho bisogno di convertire alcune masse molecolari tra grammi per mole (che usa il formato di input / output) e chilogrammi per molecola (che i calcoli interni hanno bisogno di coerenza unitaria ).

Ci sono circa 2 79 molecole in una talpa, quindi questa particolare conversione comporta la moltiplicazione o dividendo le quantità per un fattore di 1.000 × N A & approx; 6.022 × 10 26 e circa; 2 89 .

Sicuramente, questo particolare problema potrebbe essere gestito in un punto fisso, semplicemente usando diversi tipi di numeri fissi per le quantità per-mole e per-molecule, ma ciò aggiunge molta complessità al codice non ne ha davvero bisogno. E questo è lontano da un caso isolato - i calcoli fisici stessi spesso implicano la moltiplicazione con cose come costante di Boltzmann e circa; 2 -76 . In teoria, sono riuscito a gestire tutto ciò utilizzando molti tipi di punti fissi diversi e tenendo traccia di quali numeri devono essere memorizzati con quale tipo, ma perché preoccuparsi? La virgola mobile mi consente di utilizzare un singolo tipo numerico per archiviarli tutti.

Inoltre, il kicker qui è che queste masse molecolari sono fondamentalmente basate su dati sperimentali. Nessuno di loro è noto a più di dieci cifre significative o così, e anche questo è molto più della precisione di alcuni altri parametri che entrano nei calcoli. Anche i float a precisione singola sarebbero più che sufficienti per memorizzarli - sebbene io stia effettivamente usando il doppio perché, beh, non c'è un vero motivo per non farlo.

    
risposta data 17.01.2014 - 14:12
fonte
2
  • L'elaborazione audio generale utilizza i float perché questi sono sufficienti e veloci da calcolare, usando una precisione maggiore di quella offerta a 32bit float è puramente inutile; le implementazioni hanno detto che "esatto" numericamente richiederebbe molta più potenza di elaborazione e potrebbe non corrispondere alle specifiche in tempo reale. Alcune implementazioni specifiche usano il punto fisso, come per alcune (vecchie) piattaforme embed, ma non è questo lo scopo della tua domanda. Vedi link .

  • Gran parte dell'elaborazione e dell'amplificazione del segnale le implementazioni dell'algoritmo per l'elaborazione delle immagini utilizzano il floating point per gli stessi motivi. Implementazioni a punto fisso o intero sono derivate solo dagli algoritmi in virgola mobile per scopi specifici.

risposta data 17.01.2014 - 01:36
fonte
0

Se vuoi avere coefficienti, i float sono solo migliori.

Ad esempio, il 54,2% di 12442, fai solo 0.542 * 12442.

Non dimenticare che il float è calcolato da un'unità dedicata sulla CPU, la FPU. Ovviamente non sono migliori per l'hardware embedded, perché consumano più energia, ma sono molto importanti nella programmazione dei giochi e nella programmazione grafica.

Nella scienza e nella finanza, i float non sono molto apprezzati perché possono esserci perdite di dati.

Nella simulazione scientifica, credo che non siano usati, la libreria GMP ti permette di creare un float di 128 bit o anche più grande, puoi teoricamente avere una precisione grande quanto puoi, a scapito della velocità.

Nella simulazione in tempo reale, tuttavia, sono preferiti i float. Ci sono alcune precauzioni quando si utilizza il numero float se si desidera evitare la perdita di dati o l'accumulo di errori. Ad esempio, la tormenta usa un modo deterministico per cambiare lo stato del gioco quando viene giocato un gioco multiplayer di Starcraft 2, poiché vengono trasmessi solo gli ordini dei giocatori, e non le posizioni delle unità.

I float hanno solo la loro applicazione, hanno pro e contro.

    
risposta data 17.01.2014 - 21:41
fonte
-2

Molti programmatori utilizzano i float perché i doppi sono troppo lenti o occupano troppa memoria. Sulle buone GPU i doppi sono 4 volte più lenti, mentre su GPU "mediocri" (come tutte le GPU GeForce nVidia a parte la GeForce GTX Titan) possono avere un rallentamento fino a 24x. Molte GPU non supportano affatto il doppio. Ecco perché molti sviluppatori (specialmente lavorando con le console) sono costretti a usare i float. Ciò si traduce spesso in una grafica approssimativa e in un'animazione poco realistica.

Aggiornamento (per persone che hanno problemi con l'inferenza):

  1. L'intervallo del numero intero con segno a 64 bit è 2 ^ 63. L'intervallo di IEEE 754-2008 float a precisione singola è 2 ^ (2 ^ 8) = 2 ^ 256
  2. Pertanto, l'intervallo di numeri a virgola mobile a precisione singola è 2 ^ 193 = 12554203470773361527671578846415332832204710888928069025792 volte maggiore della rabbia di un intero con segno a 64 bit.
  3. I numeri a virgola mobile a precisione singola non sono sufficienti anche per le applicazioni che non richiedono calcoli precisi (come animali e giochi). I numeri a virgola mobile a precisione singola sono praticamente inutilizzabili per qualsiasi cosa richieda una precisione più elevata, come la simulazione fisica (anche nei giochi).
  4. 2 & 3 = > Gli interi a 64 bit sono sostituti molto scarsi anche per numeri a virgola mobile a precisione singola.
risposta data 17.01.2014 - 01:29
fonte

Leggi altre domande sui tag