में कनवर्ट करें एक बहुत ही उच्च प्रदर्शन ऐप में हमें लगता है कि सीपीयू लंबे अंकगणित की गणना कर सकता है, फिर युगल के साथ। हालांकि, हमारे सिस्टम में यह निर्धारित किया गया था कि हमें परिशुद्धता के 9 दशमलव स्थानों की आवश्यकता नहीं है। तो हम 9 बिंदु सटीक समझने के साथ सभी फ़्लोटिंग पॉइंट अंकगणितीय के लिए लंबे समय तक उपयोग कर रहे हैं।मंटिसा और एक्सपोनेंट को डबल
हालांकि, सिस्टम के कुछ हिस्सों में यह युगल के साथ काम करने की पठनीयता के कारण अधिक सुविधाजनक है। तो हमें 9 दशमलव स्थानों को डबल में मानने वाले लंबे मूल्य के बीच रूपांतरित करना होगा।
हम 9 की शक्ति के लिए 10 तक लंबी और विभाजित करते हैं या 1 से गुणा करके 10 की शक्ति से 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);
}
क्या आप सुनिश्चित हैं कि आपके पास मूल्य 'डबल' में बिल्कुल सही है? – Justin
शायद यह मदद करेगा, मैं इसे आपकी मदद करने के लिए बस इसे पढ़ना नहीं चाहता हूं: पी http://steve.hollasch.net/cgindex/coding/ieeefloat.html – MrFox