从C#中的double中提取尾数和指数 [英] Extracting mantissa and exponent from double in c#

查看:35
本文介绍了从C#中的double中提取尾数和指数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有任何直接的方法可以从 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中提取尾数和指数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆