在一款非常高性能的應用程序中,我們發現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