2008-11-10 8 views
18

जावा के लिए कौन सी लाइब्रेरी हैं जिनके पास फ़्लोटिंग पॉइंट या फिक्स्ड पॉइंट ऑपरेशंस के लिए हजारों अंकों की सटीकता के साथ तेज कार्यान्वयन है? वे कितने कुशल हैं?जावा फ्लोटिंग पॉइंट उच्च परिशुद्धता लाइब्रेरी

मेरे लिए एक आवश्यकता यह है कि यह एक गुणा एल्गोरिदम लागू करता है जो बेवकूफ गुणा एल्गोरिदम से बेहतर है जो 2 गुना बड़ी संख्या के अंकों के लिए 4 गुना अधिक समय लेता है (Multiplication algorithms की तुलना करें)।

+0

ब्याज के दृष्टिकोण से एक सामान्य प्रश्न ... आपका आवेदन क्या है जिसके लिए कई हजार अंकों की दशमलव परिशुद्धता की आवश्यकता होती है? – Simon

+1

यह एक शौक है, नौकरी नहीं: मैं http://en.wikipedia.org/wiki/Feigenbaum_constant –

उत्तर

35

Arbitrary Precision Arithmetic पृष्ठ पर वर्णित तीन पुस्तकालय हैं: java.math (उल्लिखित BigDecimal युक्त), Apfloat और JScience। मैं उन पर थोड़ी गति जांच चलाता हूं जो सिर्फ जोड़ और गुणा का उपयोग करता है।

परिणाम यह है कि अपेक्षाकृत कम संख्या में अंकों के लिए बिगडेसिमल ठीक है (1000 अंकों के लिए जितना तेज़ होता है), लेकिन यदि आप अधिक अंक का उपयोग करते हैं तो यह रास्ता बंद है - जेएसआईसी लगभग 4 गुना तेज है। लेकिन स्पष्ट प्रदर्शन विजेता Apfloat है। अन्य पुस्तकालयों में बेवकूफ गुणा एल्गोरिदम का उपयोग करना प्रतीत होता है जो अंकों की संख्या के वर्ग के अनुपात में आनुपातिक समय लेते हैं, लेकिन अपफ्लोट का समय लगभग रैखिक रूप से बढ़ता प्रतीत होता है। 10000 अंकों पर यह JScience के रूप में तेज़ 4 गुना था, लेकिन 40000 अंकों पर यह 16 गुना जितना तेज़ है।

दूसरी तरफ: जेएसआईसी गणितीय समस्याओं के लिए उत्कृष्ट कार्यक्षमता प्रदान करता है: मैट्रिस, वैक्टर, प्रतीकात्मक एल्गोरिदम, समीकरण प्रणाली का समाधान और क्या नहीं। तो मैं शायद जेएसआईसी के साथ जाऊंगा और बाद में एफ़्लोएट को जेएसआईसी के एल्गोरिदम में एकीकृत करने के लिए एक रैपर लिखूंगा - अच्छे डिजाइन के कारण यह आसानी से संभव लगता है।

(अद्यतन: मैं JScience की संख्या पैकेज के लिए टेस्ट स्वीट लिखा था और कीड़े की एक संख्या तय यह रिलीज 4.3.1 में चला गया तो मैं इसे बाहर की जाँच की सिफारिश कर सकते हैं।।।)

+2

के विपरीत sqrt का समर्थन नहीं करता है क्या कुछ पुस्तकालय त्रिकोणमितीय कार्यों का समर्थन करते हैं? –

+0

क्या आप कह रहे हैं कि जब आप अंक की एक निश्चित दहलीज पर जाते हैं तो JScience निरंतर ~ 4x गति लाभ बनाए रखता है? या क्या गति अंतर अधिक अंकों के लिए अधिक स्पष्ट हो जाता है? –

+0

@ आसाद मैंने इस तरह के विस्तृत प्रयोग नहीं किए, लेकिन मुझे लगता है कि वे विभिन्न समय जटिलताओं के साथ विभिन्न एल्गोरिदम का उपयोग करते हैं। (कम से कम गुणा के लिए और आगे।) इस प्रकार गति अंतर बड़ा होगा और आपके पास जितने अधिक अंक होंगे। लेकिन यदि आप अधिक अंक चाहते हैं, तो आपको अपने स्वयं के प्रयोग करने की ज़रूरत है, और शायद इसके लिए बेहतर पुस्तकालय भी हैं। –

5

क्या आपने BigDecimal के प्रदर्शन की जांच की है? मैं JavaDoc में कुछ भी स्पष्ट नहीं देख सकता, लेकिन यह निश्चित रूप से मेरा पहला बंदरगाह होगा।

+1

के कुछ और अंकों की गणना करना चाहता हूं बहुत उच्च परिशुद्धता के लिए यह बहुत धीमी है। मैं केवल तभी अनुशंसा करता हूं यदि आपके पास केवल दस अंकों हैं या गति की परवाह नहीं है। –

+0

@hstoerr: यह अच्छा है कि आपने इसे चेक किया है - लेकिन मुझे लगता है कि "काम करने वाली सबसे सरल चीज का परीक्षण करने का दृष्टिकोण" (जहां बनाया जा रहा है एक महत्वपूर्ण प्रारंभिक बिंदु लाभ है) अभी भी एक अच्छा प्रारंभिक चरण है :) –

+0

BigDecimal काफी सीमित है, उदाहरण के लिए यह JScience – Tomasz

2

आप JScience लाइब्रेरी और उनके Real संख्या वर्ग पर एक नज़र डाल सकते हैं। मुझे यकीन नहीं है कि प्रदर्शन बिगडिसीमल के सापेक्ष कैसा है, लेकिन लाइब्रेरी का लक्ष्य वैज्ञानिक अनुप्रयोगों के लिए अत्यधिक ट्यूनेड कक्षाएं प्रदान करना है, जो एक अच्छे संकेत की तरह दिखता है।

-3

Apfloat उच्च परिशुद्धता प्रदान करता है मंथिसा पर, लेकिन एक्सपोनेंट पर कम से कम सामान्य परिशुद्धता देना प्रतीत होता है (इस तथ्य के आधार पर कि यह "शून्य के लॉगरिदम" के साथ दुर्घटनाग्रस्त हो जाता है जो डबल संभाल सकता है)। तो यह बड़ी संख्या के लिए उपयोगी नहीं है।

इसके अलावा, प्रलेखन कहते हैं:

"एक ख़तरा है, कंस्ट्रक्टर्स Apfloat (नाव, लंबे समय से) और Apfloat (डबल, लंबे समय से) के साथ मौजूद है के बाद से तैरता और युगल हमेशा मूलांक 2 में आंतरिक रूप से प्रतिनिधित्व कर रहे हैं करने के लिए रूपांतरण। कोई अन्य रेडिक्स आम तौर पर गोल-ऑफ त्रुटियों का कारण बनता है, और परिणामस्वरूप एफ़्लोफैट अंकों की वांछित संख्या के लिए सटीक नहीं होगा।

उदाहरण के लिए, 0.3 को आधार 2 में बिल्कुल प्रस्तुत नहीं किया जा सकता है। जब आप एक एफ़्लोएट बनाते हैं नया अपफ्लोट (0.3 एफ, 1000), परिणामी संख्या 1000 अंकों के लिए सटीक नहीं होगी, लेकिन केवल 7 अंकों (रेडिक्स 10 में) के लिए। वास्तव में, परिणामी संख्या 0.30000001192092896 की तरह कुछ होगी ... "

ऐसा लगता है कि Apfloat कम से कम उपयोगी है।

बिगडेसिमल में लॉगरिदम फ़ंक्शन नहीं है, और प्रलेखन यह नहीं कहता है कि यह आपको डबल से बड़ी संख्या बनाने की अनुमति देता है; एक्सपोनेंट 32 बिट्स है, की तरह।

+1

दरअसल फिल, उस गड़बड़ी का कारण यह है कि आप एक फ्लोट या डबल के साथ अपफ्लोट का निर्माण कर रहे हैं। गलतता यह है क्योंकि आप इसे एक संख्या गुजर रहे हैं जो गलत है। यदि आपने अगले पैराग्राफ को पढ़ने के लिए समय निकाला है, तो आप देखेंगे कि यदि आप इसे स्ट्रिंग के साथ बनाते हैं तो आपके पास अनंत परिशुद्धता हो सकती है। – Snickers

+0

बिगडेसिमल 0.3 सटीक होगा। उस उदाहरण को लेने के लिए। क्या Apfloat BigDecimal से एक निर्माता है? BigDecimal प्रतिनिधित्व में एक संकर की तरह है, मंथिसा बेस 2 (बिगइंटर) है, लेकिन एक्सपोनेंट आधार 10 है। –