Trong một ứng dụng hiệu suất rất cao, chúng tôi tìm thấy CPU có thể tính toán số học dài nhanh hơn đáng kể sau đó với tăng gấp đôi. Tuy nhiên, trong hệ thống của chúng tôi nó đã được xác định rằng chúng tôi không bao giờ cần nhiều hơn 9 chữ số thập phân của độ chính xác. Vì vậy, chúng tôi sử dụng thời gian dài cho tất cả các số học dấu chấm động với độ chính xác 9 điểm được hiểu.Chuyển đổi mantissa và exponent thành đôi
Tuy nhiên, ở một số phần của hệ thống, điều này thuận tiện hơn do khả năng đọc được để làm việc với đôi. Vì vậy, chúng tôi phải chuyển đổi giữa giá trị dài mà giả định 9 chữ số thập phân thành hai lần.
Chúng tôi thấy đơn giản là lấy dài và chia cho 10 thành lũy thừa 9 hoặc nhân với 1 chia cho 10 thành lũy thừa 9 cho phép biểu diễn không chính xác trong một đôi.
Để giải quyết chúng tôi sử dụng Math.Round(value,9)
để cung cấp các giá trị chính xác.
Tuy nhiên, Math.Round()
có hiệu suất rất chậm. Vì vậy, ý tưởng của chúng tôi tại thời điểm này là trực tiếp chuyển đổi phần định trị và số mũ thành định dạng nhị phân của một đôi vì - theo cách đó, sẽ không cần làm tròn.
Chúng tôi đã học trực tuyến cách kiểm tra các bit của một đôi để có được phần mềm và số mũ nhưng khó hiểu để tìm ra cách đảo ngược để lấy một phần mềm và số mũ và chế tạo một đôi bằng cách sử dụng các bit.
Mọi đề xuất?
[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);
}
Bạn có chắc chắn giá trị bạn có chính xác được thể hiện bằng 'double' không? – Justin
có thể điều này sẽ giúp ích, tôi không muốn đọc tất cả chỉ để giúp bạn: P http://steve.hollasch.net/cgindex/coding/ieeefloat.html – MrFox