c# - 将尾数和指数转换为双精度

在一个非常高性能的应用程序中,我们发现CPU计算长运算的速度明显快于双倍运算。然而,在我们的系统中,我们确定永远不需要超过9位小数的精度。因此,我们使用long来计算所有浮点运算,并理解其9点精度。
但是,在系统的某些部分,由于使用双精度运算的可读性,它更加方便。因此,我们必须将假定有9个小数位的长值转换为双精度值。
我们发现,简单地取long,除以10等于9的幂,或乘以1除以10等于9的幂,就给出了不精确的双精度表示。
为了解决这个问题,我们使用Math.Round(value,9)来给出精确的值。
然而,Math.Round()对于性能来说非常慢。
所以我们现在的想法是直接将尾数和指数转换成双精度的二进制格式,因为这样,就不需要舍入了。
我们已经在网上学习了如何检查双精度的位来得到尾数和指数,但是很难找到如何逆转尾数和指数,并使用这些位来构造双精度。
有什么建议吗?

[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);

}

最佳答案

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

本文翻译自 https://stackoverflow.com/questions/8926793/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# floating-point double exponent mantissa


相关文章:

c# - 仅选择每月的第四个星期日

c# - 您能否在调用GC.Collect和GC.WaitForPendingFinalizers时陷入僵局?

c# - 为什么Math.Tan(90)提供一个未定义的值?

java - Java中的随机加权选择

java - 为什么int = int * double给出错误而int * = double却没有(在Java中)? [重复]

c# - 如何创建IObservable <T>,每隔-n-秒返回一个值,而不跳过任何

c# - 是否可以在不同的线程上多次抛出一个C#异常?

iphone - 与浮点数和整数混淆

c# - 相当于Python中的BitConverter.DoubleToInt64Bits