कोडप्लेक्स से BigRational प्राप्त करें। माइक्रोसॉफ्ट के Base Class Library का इसका हिस्सा, इसलिए यह नेट के लिए एक प्रगति-प्रगति है। अपरिहार्य अतिप्रवाह/अधःप्रवाह/परिशुद्धता है, ज़ाहिर है, एक और समस्या के नुकसान के साथ काम
System.Numerics.BigInteger x = GetDividend() ;
System.Numerics.BigInteger y = GetDivisor() ;
BigRational r = new BigRational(x , y) ;
double value = (double) r ;
: एक बार आपको लगता है कि है, तो कुछ इस तरह से करते हैं।
चूंकि आप अपने कोड में BigRational पुस्तकालय ड्रॉप नहीं कर सकते, जाहिर है, अन्य दृष्टिकोण "रोलिंग की
आसान तरीका right algorithms book बाहर निकलने के लिए और अपने खुद के रोल ..., ज़ाहिर है, हो सकता है एक का अपना "यहां, चूंकि एक तर्कसंगत संख्या को दो पूर्णांक के अनुपात (विभाजन) के रूप में दर्शाया गया है, इसलिए बिगरेनल क्लास से डबल ऑपरेटर को स्पष्ट रूपांतरण प्राप्त करना है और इसे सूट करने के लिए ट्विक करना है। मुझे लगभग 15 मिनट लग गए।
मेरे द्वारा किए गए एकमात्र महत्वपूर्ण संशोधन के परिणामस्वरूप परिणाम सकारात्मक होता है जब परिणाम सकारात्मक या नकारात्मक शून्य/अनंत होता है। जब मैं उस पर था, मैंने इसे आपके लिए BigInteger
एक्सटेंशन विधि में परिवर्तित कर दिया:
public static class BigIntExtensions
{
public static double DivideAndReturnDouble(this BigInteger x , BigInteger y)
{
// The Double value type represents a double-precision 64-bit number with
// values ranging from -1.79769313486232e308 to +1.79769313486232e308
// values that do not fit into this range are returned as +/-Infinity
if (SafeCastToDouble(x) && SafeCastToDouble(y))
{
return (Double) x/(Double) y;
}
// kick it old-school and figure out the sign of the result
bool isNegativeResult = ((x.Sign < 0 && y.Sign > 0) || (x.Sign > 0 && y.Sign < 0)) ;
// scale the numerator to preseve the fraction part through the integer division
BigInteger denormalized = (x * s_bnDoublePrecision)/y ;
if (denormalized.IsZero)
{
return isNegativeResult ? BitConverter.Int64BitsToDouble(unchecked((long)0x8000000000000000)) : 0d; // underflow to -+0
}
Double result = 0 ;
bool isDouble = false ;
int scale = DoubleMaxScale ;
while (scale > 0)
{
if (!isDouble)
{
if (SafeCastToDouble(denormalized))
{
result = (Double) denormalized;
isDouble = true;
}
else
{
denormalized = denormalized/10 ;
}
}
result = result/10 ;
scale-- ;
}
if (!isDouble)
{
return isNegativeResult ? Double.NegativeInfinity : Double.PositiveInfinity;
}
else
{
return result;
}
}
private const int DoubleMaxScale = 308 ;
private static readonly BigInteger s_bnDoublePrecision = BigInteger.Pow(10 , DoubleMaxScale) ;
private static readonly BigInteger s_bnDoubleMaxValue = (BigInteger) Double.MaxValue;
private static readonly BigInteger s_bnDoubleMinValue = (BigInteger) Double.MinValue;
private static bool SafeCastToDouble(BigInteger value)
{
return s_bnDoubleMinValue <= value && value <= s_bnDoubleMaxValue;
}
}
स्रोत
2012-08-08 21:00:18
आपको यह कितना सटीक होना चाहिए? –
आप जिन संख्याओं से निपट रहे हैं, वे संख्याएं – MethodMan
@ ऑस्टिनसलोलेन: सटीक परिशुद्धता जितनी अधिक होगी, सटीकता के कुछ दशमलव अंक भी मुझे प्राप्त करने के लिए पर्याप्त होंगे। –