2010-09-27 15 views
15

Hola todos, pregunta rápida: ¿Cómo se representa un tipo .NET decimal en binario en la memoria?Representación binaria de .NET Decimal

Todos sabemos cómo se almacenan los números de punto flotante y los thusly las razones de la inexactitud de los mismos, pero no puedo encontrar ninguna información sobre decimal excepto los siguientes:

  1. parecer más precisa que la flotante números de punto
  2. Toma 128 bits de memoria
  3. 2^96 + signo gama
  4. 28 (a veces 29?) cifras totales significativos en el número

¿Hay alguna manera de que pueda resolver esto? El científico de la computación en mí exige la respuesta y después de una hora de intentos de investigación, no puedo encontrarla. Parece que hay muchas partes perdidas o solo estoy imaginando esto mal en mi cabeza. ¿Alguien puede arrojar algo de luz sobre esto, por favor? Gracias.

Respuesta

30

Decimal.GetBits para la información que desee.

Básicamente es un número entero de 96 bits como la mantisa, más un signo de bit, más un exponente para decir cuántos decimal lugares para desplazarlo a la derecha.

Así que para representar 3.261 que tendría una mantisa de 3261, un bit de signo de 0 (es decir, positivo), y un exponente de 3. Observe que decimal no se normalizó (deliberadamente) por lo que puede representar también 3.2610 usando una mantisa de 32610 y un exponente de 4, por ejemplo.

Tengo más información en mi artículo sobre decimal floating point.

+0

+1 respuesta fantástica, directa al grano y rica en información. – JoshD

+0

@Jacob: No, eso * claramente * no es cierto. Dado que puedes comenzar con un número entero y terminar con (digamos) 0.1, eso obviamente se está desplazando hacia la derecha. Si pudieras * solo * desplazarte hacia la izquierda, podrías representar 10, 100, etc., pero no 0.1, 0.01, etc. En el futuro, espera un "aviso" antes de cambiar significativamente el significado de una respuesta como esta. Consulte la documentación para 'decimal': http://msdn.microsoft.com/en-us/library/1k2e8atx.aspx, donde se habla del factor de escala como * dividiendo * el número entero, que es equivalente a desplazarlo al derecho. –

+0

Mis disculpas. Para mí, es más intuitivo pensar que cambia el * punto decimal * a la * izquierda *, pero ahora veo que te refieres a "cambiar" la mantisa. – Jacob

Cuestiones relacionadas