Domanda

Probabilmente sono completamente sbagliato, e io non so davvero nulla, ma ho una domanda sui tipi di numero di dati decimali nei linguaggi di programmazione. Capisco che i galleggianti non sono del tutto precise, perché sono memorizzati in binario con un potere o qualcosa, ma mi sono sempre chiesto il motivo per cui i tipi di dati numerici decimali non si limitano a memorizzare un numero, come se non ci fosse decimale, così fanno calcoli se non ci fosse un numero decimale, e quindi aggiungerlo dopo. Come in questa situazione:

2.159 * 3.507 --> 2159 * 3507 = 7571613
  ^^^     ^^^
  123     456

6 decimals in total... 7571613 -> 7.571613
                        ^^^^^^
                        654321

in modo da 2.159 * 3.507 = 7,571,613 mila

Perché non può solo lavorare così?

È stato utile?

Soluzione

E 'esattamente quello che fanno. Un numero a virgola mobile viene memorizzato in forma esponenziale. Supponiamo che stiamo lavorando su un computer basato su decimale in modo da non devo cambiare tutti questi numeri in binario.

Si sta moltiplicando 2.159 * 3.507, ma in realtà 2.159 viene memorizzata come 2159 * 10^-3 e 3.507 viene memorizzato come 3507 * 10^-3. Dal momento che stiamo lavorando su un sistema decimale-based, il 10 si presume, quindi abbiamo solo davvero per memorizzare -3 senza il 10, in questo modo: 2159,-3 o 3507,-3. Il -3 è la posizione del "punto fluttuante":. Come il punto si sposta a sinistra i virgola mobile diminuisce (.3507 viene memorizzato come 3507,-4) e come il punto si sposta a destra le virgola mobile aumenta (35.07 viene memorizzato come 3507,-2)

Quando si moltiplica i due insieme, il numero decimale (o il numero binario su un computer binario) è l'unica cosa che viene moltiplicato. Il floating point viene aggiunto Quindi, dietro le quinte, quello che succede è:

2.159 * 3.507
2159,-3 * 3507,-3
2159 * 3507,-3 + -3
7571613,-6

7571613,-6 è solo 7571613 * 10^-6 (ricordiamo che possiamo assumere la 10 perché stiamo lavorando su un computer decimale), che è la stessa di 7.571613.

Naturalmente, la virgola mobile non deve essere -3, potrebbe essere qualsiasi cosa che si inserisce l'archiviazione:

21590 * .3507
2159,1 * 3507,-4
2159 * 3507,1 + -4
7571613,-3
7571.613

E, naturalmente, la maggior parte dei computer non memorizzare le cose in decimale, quindi i numeri reali sarebbero tutti in binario, e la virgola mobile sarebbe qualcosa di simile 2^-9 -> -9 piuttosto che 10^-3 -> -3. Ma si ottiene l'idea.

Altri suggerimenti

Questo si chiama " a virgola fissa aritmetiche " Le persone fanno tutto il tempo .

http://gameprogrammer.com/4-fixed.html

Ci sono alcune implementazioni di aritmetica a virgola fissa. Tuttavia, spesso a corto di cifre decimali molto, molto rapidamente con lo stoccaggio a punto fisso. E 'ideale per le transazioni monetarie, dove sappiamo che non stiamo andando per memorizzare / cura su eventuali numeri irrazionali.

In aggiunta, per un sacco di altre cose, aritmetica a virgola fissa semplicemente non vale l'overhead. virgola mobile è solo molto più veloce.

Da leggere:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top