将尾数和指数转换为double

Way*_*yne 8 c# floating-point double mantissa exponent

在一个性能非常高的应用程序中,我们发现CPU可以比双精度计算更长的运算速度.然而,在我们的系统中,我们确定我们从不需要超过9位小数的精度.所以我们使用long来进行所有浮点运算,并且可以理解9点精度.

但是,在系统的某些部分,由于可读性与双打一起工作,因此更方便.因此,我们必须将假设9位小数的长值转换为double.

我们发现简单地将长度除以10除以9的幂或乘以1除以10得到9的幂给出不精确的表示.

为了解决这个问题,我们使用了Math.Round(value,9)给出精确的值.

但是,Math.Round()表现的可怕性很慢.

所以我们现在的想法是直接将尾数和指数转换为double的二进制格式 - 因为这样就不需要舍入.

我们已经在线学习了如何检查双尾的位以获得尾数和指数,但是如何通过使用位来弄清楚如何反转它以获取尾数和指数以及制造双精度令人困惑.

有什么建议?

[Test]
public unsafe void ChangeBitsInDouble()
{
    var original = 1.0D;
    long bits;
    double* dptr = &original;
    //bits = *(long*) dptr;
    bits = BitConverter.DoubleToInt64Bits(original);
    var negative = (bits < 0);
    var exponent = (int) ((bits >> 52) & 0x7ffL);
    var mantissa = bits & 0xfffffffffffffL;
    if( exponent == 0)
    {
        exponent++;
    }
    else
    {
        mantissa = mantissa | (1L << 52);
    }
    exponent -= 1075;

    if( mantissa == 0)
    {
        return;
    }

    while ((mantissa & 1) == 0)
    {
        mantissa >>= 1;
        exponent++;
    }

    Console.WriteLine("Mantissa " + mantissa + ", exponent " + exponent);

}
Run Code Online (Sandbox Code Playgroud)

eri*_*len 1

您不应使用 10^9 的比例因子,而应使用 2^30。