extrayendo mantisa y exponente del doble en c #

¿Hay alguna manera directa de obtener la mantisa y el exponente de un doble en c # (o .NET en general)?

Encontré este ejemplo usando Google, pero no estoy seguro de cuán robusto sería. ¿Podría la representación binaria para un doble cambio en alguna versión futura del marco, etc.?

La otra alternativa que encontré fue usar System.Decimal en lugar de doble y usar el método Decimal.GetBits () para extraerlos.

¿Alguna sugerencia?

El formato binario no debería cambiar, sin duda sería un cambio radical en las especificaciones existentes. Se define como en formato IEEE754 / IEC 60559: 1989, como dijo Jimmy. (C # 3.0, especificación de lenguaje, sección 1.3; ECMA 335, sección 8.2.2). El código en DoubleConverter debe ser fino y robusto.

En aras de futuras referencias, el bit relevante del código en el ejemplo es:

public static string ToExactString (double d) { … // Translate the double into sign, exponent and mantissa. long bits = BitConverter.DoubleToInt64Bits(d); // Note that the shift is sign-extended, hence the test against -1 not 1 bool negative = (bits < 0); int exponent = (int) ((bits >> 52) & 0x7ffL); long mantissa = bits & 0xfffffffffffffL; // Subnormal numbers; exponent is effectively one higher, // but there's no extra normalisation bit in the mantissa if (exponent==0) { exponent++; } // Normal numbers; leave exponent as it is but add extra // bit to the front of the mantissa else { mantissa = mantissa | (1L<<52); } // Bias the exponent. It's actually biased by 1023, but we're // treating the mantissa as m.0 rather than 0.m, so we need // to subtract another 52 from it. exponent -= 1075; if (mantissa == 0) { return "0"; } /* Normalize */ while((mantissa & 1) == 0) { /* ie, Mantissa is even */ mantissa >>= 1; exponent++; } … } 

Los comentarios tenían sentido para mí en ese momento, pero estoy seguro de que tendría que pensar un rato sobre ellos ahora. Después de la primera parte, tienes el exponente “crudo” y la mantisa: el rest del código solo ayuda a tratarlos de una manera más simple.

La representación es un estándar IEEE y no debe cambiar.

https://msdn.microsoft.com/en-us/library/system.double(v=vs.110).aspx

El tipo doble cumple con el estándar IEC 60559: 1989 (IEEE 754) para la aritmética binaria en coma flotante.

EDITAR: La razón por la cual el decimal tiene un getBits y el doble no es ese decimal preserva dígitos significativos. 3.0000m == 3.00m pero los exponentes / mantisas son en realidad diferentes. Creo que los flotadores / dobles están representados de manera única.