2011-04-18 14 views
6

मैं वर्तमान में एक छोटी सी भाषा है कि जावास्क्रिप्ट को संकलित करता है के लिए एक संकलक लिख रहा हूँ। इस भाषा में, मुझे पूर्णांक होना पसंद है, लेकिन जावास्क्रिप्ट केवल संख्या का समर्थन करता है, जो एक डबल-प्रेसिजन फ्लोटिंग पॉइंट मान है। तो, जावास्क्रिप्ट में पूर्णांक को लागू करने का सबसे प्रभावी तरीका क्या है? और संख्या का उपयोग करने की तुलना में यह कितना कुशल है?जावास्क्रिप्ट: कुशल पूर्णांक गणित

विशेष रूप से, अतिप्रवाह व्यवहार अन्य भाषाओं के अनुरूप होना चाहिए: उदाहरण के लिए, INT_MAX को जोड़ने INT_MIN देना चाहिए। इंटीग्रर्स या तो 32-बिट या 64-बिट होना चाहिए।

उत्तर

3

मैं जावास्क्रिप्ट में BigIntegers के इस कार्यान्वयन पाया?

संपादित करें: इसके अलावा, गूगल बंद पुस्तकालय को लागू करता है 64-बिट पूर्णांकों: http://code.google.com/p/closure-library/source/browse/trunk/closure/goog/math/long.js

ये मूलतः सिर्फ पैदा सुविधा वस्तुओं हालांकि, और मौलिक डेटा प्रकार दक्षता में सुधार लाने के लिए कुछ भी नहीं होगा।

0

अच्छी तरह से आप जावास्क्रिप्ट के नंबर प्रकार का चयन कर सकते हैं जो शायद आपके सीपीयू के प्राइमेटिव्स का उपयोग करके गणना की जाती है या आप ऑपरेटरों और कार्यों के एक पूर्ण पैकेज को लेयर करना चुन सकते हैं और बिट्स की नकली श्रृंखला पर नहीं ...?

... प्रदर्शन और कार्यकुशलता में अपनी चिंता है, तो युगल के साथ चिपके रहते हैं।

1

सभी नंबर नंबर रहे हैं। इसके अलावा कोई रास्ता नहीं है। जावास्क्रिप्ट में कोई बाइट या int टाइप नहीं है। या तो सीमाओं के साथ सौदा करें या अपने कंपाइलर को लिखने के लिए एक और निम्न स्तर की भाषा का उपयोग करें।

यदि आप इसे प्राप्त करना चाहते हैं तो एकमात्र समझदार विकल्प जावास्क्रिप्ट दुभाषियों में से एक को संपादित करना है (V8 कहें) और जेएस को एक्सेस की अनुमति देने के लिए देशी सी बाइट्स के लिए।

1

एक आधुनिक सीपीयू पर यदि आप अपने पूर्णांक मानों को श्रेणी + - 2^52 तक सीमित करते हैं तो double का उपयोग long का उपयोग करने से कम कुशल होगा।

double आईईई 754 प्रकार में मंटिसा के 53 बिट्स हैं, ताकि आप आसानी से 32-बिट पूर्णांक रेंज का प्रतिनिधित्व कर सकें और फिर कुछ।

किसी भी घटना में, जावास्क्रिप्ट के बाकी अंकगणित को संभालने के लिए प्रयोग किया जाता है व्यक्ति सीपीयू निर्देश की तुलना में एक टोंटी की और अधिक हो जाएगा। http://www-cs-students.stanford.edu/~tjw/jsbn/

शायद यह मदद मिलेगी:

0

सबसे कारगर नंबरों का उपयोग करने, और सुनिश्चित करें कि नकली पूर्णांकों पर संचालन एक पूर्णांक परिणाम देना होगा बनाने के लिए आपरेशन जोड़ने होगा। उदाहरण के लिए एक विभाजन को गोलाकार करना होगा, और गुणा को पूर्णांक में फिट करने के लिए ओवरफ्लो या मास्क किए जाने के लिए या तो जांच की जानी चाहिए।

इसका मतलब यह है कि आपकी भाषा में फ़्लोटिंग पॉइंट ऑपरेशंस पूर्णांक ऑपरेशंस की तुलना में काफी तेज़ होगा, जो पहले स्थान पर पूर्णांक प्रकार के अधिकांश उद्देश्य को हरा देता है।

8

तो, जावास्क्रिप्ट में पूर्णांक को लागू करने का सबसे प्रभावी तरीका क्या है?

आदिम संख्या का प्रकार उतना ही कुशल है जितना इसे प्राप्त होता है। कई आधुनिक जेएस इंजन जेआईटी संकलन का समर्थन करते हैं, इसलिए यह मूल फ्लोटिंग-पॉइंट अंकगणित के रूप में लगभग उतना ही कुशल होना चाहिए।

विशेष रूप से, अतिप्रवाह व्यवहार अन्य भाषाओं के अनुरूप होना चाहिए: उदाहरण के लिए, INT_MAX को जोड़ने INT_MIN देना चाहिए। इंटीग्रर्स या तो 32-बिट या 64-बिट होना चाहिए।

आप मानक 32-बिट पूर्णांक अंकगणित के अर्थशास्त्र को प्राप्त कर सकते हैं यह ध्यान में रखते हुए कि जावास्क्रिप्ट बिट्स ऑपरेशंस के लिए "संख्याओं" को 32-बिट पूर्णांक में परिवर्तित करता है। >>> (हस्ताक्षरित दायां शिफ्ट) अपने ऑपरेंड को एक हस्ताक्षरित 32-बिट पूर्णांक में परिवर्तित करता है जबकि शेष (अन्य सभी बदलाव और बिटवाई और/OR) अपने ऑपरेंड को 32-बिट पूर्णांक में परिवर्तित करते हैं।

  • 0xFFFFFFFF | 0 पैदावार -1 (हस्ताक्षरित डाली)
  • (0xFFFFFFFF + 1) | 0 पैदावार 0 (अतिप्रवाह)
  • -1 >>> 0 पैदावार 0xFFFFFFFF (अहस्ताक्षरित कलाकारों)
+0

'x | 0' संख्या के पूर्णांक घटक रिटर्न ?? वाह, यह जानना अच्छा है: ' –

+0

@ सिम विदास: हां, यह एक संख्या को गोल करने का एक त्वरित तरीका है, जब तक कि यह 2^32 से कम हो। – casablanca

0

ध्यान दें कि ECMA-262 संस्करण 3: उदाहरण के लिए जोड़ा Number.prototype.toFixed, जो एक सटीक तर्क लेता है यह बताते हुए कि दशमलव बिंदु के बाद दिखाएं। इस विधि का अच्छी तरह से उपयोग करें और परिमित सटीक आधार 2 और "मनमानी" या "उपयुक्त" परिशुद्धता आधार 10 के बीच असमानता को ध्यान में रखेगा जो हम हर दिन उपयोग करते हैं। - Brendan Eich