c# - 将尾数和指数转换为 double

标签 c# floating-point double exponent mantissa

在一个非常高性能的应用程序中,我们发现 CPU 计算长算术的速度明显快于 double 。然而,在我们的系统中,确定我们永远不需要超过 9 位小数的精度。因此,我们对所有具有 9 点精度的浮点运算使用 long。

然而,在系统的某些部分,由于可读性,使用 double 更方便。所以我们必须将假定小数点后 9 位的 long 值转换为 double。

我们发现简单地取 long 并除以 10 的 9 次方或乘以 1 除以 10 的 9 次方会给出不精确的 double 表示。

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

但是,Math.Round() 的性能非常慢。

所以我们目前的想法是直接将尾数和指数转换为 double 的二进制格式,因为这样就不需要四舍五入了。

我们已经在网上学习了如何检查 double 的位以获得尾数和指数,但弄清楚如何反转它以获取尾数和指数并通过使用这些位来构造 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);

}

最佳答案

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

关于c# - 将尾数和指数转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8926793/

相关文章:

java - 双变量输入

C# - 调用具有所有默认参数的结构构造函数

c# - 如何在 C# 单元测试中向请求添加测试 cookie

c - 在 C 中初始化为零的浮点变量的相等性

将数组转换为 int/float

c - 如何控制 double 变量小数点字符后出现的位数?

c# - c# 和 newtonsoft 中的 JSON 日期和日期时间序列化

c# - System.Text.Json 中 JObject.FromObject 的对应项是什么

c++ - std::pow 不返回预期的 int 值

c - C如何处理混合精度运算