问题描述
是否有任何直接的方法可以从 c#(或一般 .NET)中的双精度数获取尾数和指数?
Is there any straightforward way to get the mantissa and exponent from a double in c# (or .NET in general)?
我使用 Google 找到了 this example,但我不确定它的稳定性如何是.在某些未来版本的框架等中,二进制表示是否可以进行双重更改?
I found this example using Google, but I'm not sure how robust it would be. Could the binary representation for a double change in some future version of the framework, etc?
我发现的另一种选择是使用 System.Decimal 而不是 double 并使用 Decimal.GetBits() 方法来提取它们.
The other alternative I found was to use System.Decimal instead of double and use the Decimal.GetBits() method to extract them.
有什么建议吗?
推荐答案
二进制格式不应该改变——它肯定会是对现有规范的重大改变.正如 Jimmy 所说,它被定义为 IEEE754/IEC 60559:1989 格式.(C# 3.0 语言规范第 1.3 节;ECMA 335 第 8.2.2 节).DoubleConverter 中的代码应该很好且健壮.
The binary format shouldn't change - it would certainly be a breaking change to existing specifications. It's defined to be in IEEE754 / IEC 60559:1989 format, as Jimmy said. (C# 3.0 language spec section 1.3; ECMA 335 section 8.2.2). The code in DoubleConverter should be fine and robust.
为了方便以后参考,示例中代码的相关位是:
For the sake of future reference, the relevant bit of the code in the example is:
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 & (1L << 63)) != 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 negative ? "-0" : "0";
}
/* Normalize */
while((mantissa & 1) == 0)
{ /* i.e., Mantissa is even */
mantissa >>= 1;
exponent++;
}
…
}
当时这些评论对我来说是有意义的,但我相信我现在必须考虑一段时间.在第一部分之后,您得到了原始"指数和尾数 - 其余代码只是有助于以更简单的方式处理它们.
The comments made sense to me at the time, but I'm sure I'd have to think for a while about them now. After the very first part you've got the "raw" exponent and mantissa - the rest of the code just helps to treat them in a simpler fashion.
这篇关于从C#中的double中提取尾数和指数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!