2011-11-13 14 views
5

इस कोड पर विचार करें:सी # उच्च परिशुद्धता गणना

double result = Math.Sqrt(4746073226998689451); 

परिणाम के लिए मैं 2178548421.999999854etc के बजाय +२१७८५४८४२२ मिलता है ... मैं और अधिक सटीक परिणाम कैसे मिल सकता है?

उत्तर

7

की जाँच विशेष समस्या के लिए, वर्गमूल कंप्यूटिंग, और न्यूटन के एल्गोरिथ्म:

using System; 

class Program 
{ 
    public static void Main() 
    { 
    long x = 4746073226998689451; 
    decimal sqrt_x = (decimal)Math.Sqrt(x); 
    for (int i = 0; i < 10; ++i) 
     sqrt_x = 0.5m * (sqrt_x + x/sqrt_x); 
    Console.WriteLine("{0:F16}", sqrt_x); 
    } 
} 

परिणाम है:

2178548421.9999998547197773 
1

digit by digit calculation का उपयोग करके आप जितने अंक खोज रहे हैं उतने अंक देंगे।

+0

यह पुनर्विचार होगा पहिया। – Dykam

+0

@Dykam - क्यों? मैं सुझाव नहीं दे रहा हूं कि उसे एल्गोरिदम स्वयं कोड करना चाहिए। यदि कोई कार्यान्वयन है, तो हर तरह से इसका इस्तेमाल करें। –

+0

यह सच है, लेकिन मनमाने ढंग से गणना के लिए कई एल्गोरिदम हैं, यह केवल एक है। मुझे लगता है कि यह एक कार्यान्वयन से जोड़ने के लिए और अधिक उपयोगी होगा। – Dykam

6

विकिपीडिया - Arbitrary-percision artithmatic पृष्ठ पर उल्लिखित .NET के लिए उच्च परिशुद्धता गणित पुस्तकालयों का एक गुच्छा है।

मैंने बिगनम को पहले यहां अनुशंसित देखा है, हालांकि विकिपीडिया लिंक टूटा हुआ है और मुझे इस समय कहीं और लाइब्रेरी नहीं मिल रही है।

पृष्ठ पर दूसरा विकल्प C# binding for MPIR है।

+0

वह बिग्नम लिंक टूटा हुआ है। –

+0

@ जॉर्ज डकेट - तो यह है। क्या आपके पास एक कार्यस्थल साइट का लिंक है? – Oded

+0

मुझे नहीं, क्षमा करें। –

1
डबल के बजाय

, आप दशमलव प्रकार का उपयोग कर सकते हैं बड़ा पूर्णांक कोशिश करते हैं और यह भी इस लिंक

Big numbers with fraction support