2011-12-03 14 views
8

उत्पन्न करना चाहता था मैं जानना चाहता था कि मैं एनएच अंक में पीआई कैसे उत्पन्न कर सकता हूं। मेरे पास कुछ बुनियादी विचार हैं।पीएच से एनएच अंक जावा

  1. उपयोग Math.PI और सटीक वृद्धि (है कि यदि संभव है)
  2. उपयोग यूलर सूत्र अनुकरणीय लेकिन यहाँ भी उत्पन्न करने के लिए, मैं परिशुद्धता (मुझे लगता है कि) Euler's formula for PI
  3. वहाँ भी श्रीनिवास है बढ़ाने के लिए की आवश्यकता होगी पीआई उत्पन्न करने के लिए रामानुजन का सूत्र जो इसके तीव्र अभिसरण के लिए जाना जाता है। यह सूत्र लागू करना मुश्किल लगता है। मेरा मानना ​​है कि मुझे यहां डीकमल परिशुद्धता भी बढ़ाना होगा।
    enter image description here

तो संक्षेप में, किसी भी तरह से, मैं क्या वें अंकों के आधार पर BigDecimal की शुद्धता को बढ़ाने के लिए की आवश्यकता होगी। मैं BigDecimal की सटीकता को बढ़ाने के लिए कैसे जाउंगा? इसके अलावा, यदि ऐसा करने के लिए बेहतर और तेज़ है, तो क्या आप मुझे सही दिशा में इंगित कर सकते हैं।

संपादित करें: मैं सिर्फ पीआई उत्पन्न करना चाहता हूं। मैं गणना के लिए उपयोग नहीं करना चाहता। और यह एक प्रश्न है कि मैं पीआई उत्पन्न करने के अपने विचारों को लागू करने के लिए बिगडेसिमल का उपयोग कैसे कर सकता हूं।

+0

आप वास्तव में पाई उत्पन्न करने के लिए की जरूरत है या आप इसे गणना के लिए की आवश्यकता है उपयोग कर सकते हैं? –

+0

क्या यह पीआई कंप्यूटिंग के पीछे गणित के बारे में एक प्रश्न है, या 'BigDecimal' का उपयोग कैसे करें? –

+0

मैं केवल पीआई सूत्रों को लागू करने के लिए बिगडेसिमल का उपयोग कर रहा हूं और मुझे गणना करने के लिए पीआई की आवश्यकता नहीं है, मैं बस इसे उत्पन्न करना चाहता हूं। –

उत्तर

6
  • Math.PIdouble प्रकार का है। इसका मतलब परिशुद्धता के लगभग 15 दशमलव अंक है, और यह आपके पास मौजूद सभी डेटा है; कुछ भी जादुई रूप से पीआई के अतिरिक्त अंक दिखाई देगा।
  • BigDecimal मनमाने ढंग से सटीक है। setScale() आपको BigDecimal ऑब्जेक्ट्स को जितना चाहें उतना सटीकता के साथ बनाने की अनुमति देता है और अधिकांश अंकगणितीय विधियां स्वचालित रूप से आवश्यकतानुसार सटीकता को बढ़ाएंगी, लेकिन निश्चित रूप से अधिक सटीकता, धीमी सभी गणनाएं होंगी।
  • रामानुजन के सूत्र को लागू करने का सबसे कठिन हिस्सा विडंबनात्मक रूप से स्थिर कारक में वर्ग (2) होगा, क्योंकि BigDecimal के लिए अंतर्निहित sqrt() नहीं है, इसलिए आपको अपना खुद लिखना होगा।
+0

लेकिन वर्ग रूट के लिए, अच्छी पुरानी हेरोन विधि परिशुद्धता के दस लाख (या एक अरब) अंकों के साथ भी तेजी से पर्याप्त रूप से परिवर्तित होती है। Sqrt (2) भाग के लिए –

+0

, क्या मैं केवल पूर्व परिभाषित मान का उपयोग नहीं कर सकता? 1.41421356, या किसी भी तरह से गणना बदल जाएगा? –

+0

@ user681159: ठीक है, जैसे ही आप पीआई का अपना मूल्य अधिक सटीक होना चाहते हैं कि "पूर्व परिभाषित मान", आपको sqrt (2) के अधिक अंक की आवश्यकता होगी। –

3

आप BigDecimal

जैसे की शुद्धता को बढ़ाने के लिए MathContext उपयोग करने की आवश्यकता

MathContext mc = new MathContext(1000); 
BigDecimal TWO = new BigDecimal(2, mc); 

ऐसा नहीं है कि सभी BigDecimal रों आप अपनी गणना में उपयोग कि MathContext का उपयोग महत्वपूर्ण है। हेरॉन की विधि आपको केवल 10 पुनरावृत्तियों के साथ 1000 अंकों की सटीकता और 20 पुनरावृत्तियों के साथ दस लाख अंक देनी चाहिए, इसलिए यह निश्चित रूप से पर्याप्त है। इसके अलावा, सभी स्थिर BigDecimal जैसे उदा। आपके कार्यक्रम की शुरुआत में केवल एक बार 26390

+0

हेरॉन की विधि से आपका क्या मतलब है? –

+0

@ user681159 हेरॉन की विधि स्क्वायर जड़ों के मामले के लिए न्यूटन-रैफसन विधि के साथ मेल खाती है, यदि आप बाद वाले से परिचित हैं। अन्यथा: यह 'xq (n + 1) = 1/2 * (x_n + a/x_n) 'के माध्यम से' sqrt (ए) 'के लिए बेहतर अनुमान ढूंढ रहा है। यह सभी 'ए> 0' और किसी भी प्रारंभिक मान' x_0> 0' के लिए अभिसरण करता है। यदि आप काफी अच्छे अनुमान के साथ शुरू करते हैं, तो प्रत्येक चरण में सही अंकों की संख्या दोगुनी (लगभग) होती है। –

0

आप इस कोड

import java.math.BigDecimal; 
import java.math.RoundingMode; 

public final class Pi { 

private static final BigDecimal TWO = new BigDecimal("2"); 
private static final BigDecimal FOUR = new BigDecimal("4"); 
private static final BigDecimal FIVE = new BigDecimal("5"); 
private static final BigDecimal TWO_THIRTY_NINE = new BigDecimal("239"); 

private Pi() {} 

public static BigDecimal pi(int numDigits) { 

    int calcDigits = numDigits + 10; 

    return FOUR.multiply((FOUR.multiply(arccot(FIVE, calcDigits))) 
    .subtract(arccot(TWO_THIRTY_NINE, calcDigits))) 
    .setScale(numDigits, RoundingMode.DOWN); 
} 

private static BigDecimal arccot(BigDecimal x, int numDigits) { 

BigDecimal unity = BigDecimal.ONE.setScale(numDigits, 
    RoundingMode.DOWN); 
BigDecimal sum = unity.divide(x, RoundingMode.DOWN); 
BigDecimal xpower = new BigDecimal(sum.toString()); 
BigDecimal term = null; 

boolean add = false; 

for (BigDecimal n = new BigDecimal("3"); term == null || 
    term.compareTo(BigDecimal.ZERO) != 0; n = n.add(TWO)) { 

    xpower = xpower.divide(x.pow(2), RoundingMode.DOWN); 
    term = xpower.divide(n, RoundingMode.DOWN); 
    sum = add ? sum.add(term) : sum.subtract(term); 
    add = ! add; 
} 
return sum; 
} 
} 

resource

+0

इस कोड के साथ एक समस्या है जो कुछ शर्तों के तहत एक अनंत लूप की ओर जाता है ;-( –