提取尾数和指数从双c#

有没有什么简单的方法来获得尾数和指数从双c#(或一般的.NET)?

我发现这个例子使用谷歌,但我不知道它将是多么强大。 在一些未来的框架版本中,是否可以使用二进制表示来改变?

我发现的另一种select是使用System.Decimal而不是double,并使用Decimal.GetBits()方法来提取它们。

有什么build议么?

二进制格式不应该改变 – 对现有规范肯定是一个突破性的改变。 正如Jimmy所说,它被定义为IEEE754 / IEC 60559:1989格式。 (C#3.0语言规范第1.3节; ECMA 335第8.2.2节)。 DoubleConverter中的代码应该很好并且很健壮。

为了将来的参考,示例中代码的相关位是:

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++; } … } 

当时的意见对我来说是有意义的,但我相信现在我必须想一想他们。 在第一部分你已经得到了“原始”指数和尾数 – 其余的代码只是帮助以更简单的方式对待它们。

该表示是IEEE标准,不应该改变。

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

Double型符合二进制浮点运算的IEC 60559:1989(IEEE 754)标准。

编辑:为什么十进制有一个getBits和双不是十进制保留有效数字。 3.0000m == 3.00m但指数/曼陀罗实际上是不同的。 我认为漂浮/双打是唯一代表。