在一款非常高性能的应用程序中,我们发现CPU可以计算长计算的速度明显快于双精度。但是,在我们的系统中,确定我们从不需要超过9位小数位的精度。所以我们对所有浮点运算都使用long,并且理解了9点精度。将尾数和指数转换为双精度值
但是,在系统的某些部分,由于可读性与双打一起工作,因此更方便。所以我们必须将假设9位小数的长整数值转换为双整数值。
我们发现简单地取长整数除以10的幂乘以9或乘以1除以10的幂后得到不精确的表示。
为了解决这个问题,我们使用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);
}
您确定您拥有的价值完全可以用double来表示吗? – Justin
也许这将有所帮助,我不想全部阅读它只是为了帮助您:P http://steve.hollasch.net/cgindex/coding/ieeefloat.html – MrFox