2009-07-26 15 views
26
Hugs> 94535^445 
1376320882321377050696053887661515621104890164005282153069726424773999801846841903244827702943487982707454966009456016735041878000604143500908532887464920380605164932112687039059526672109818924234920844448231612532570718657160234177285377733830104834041049076609912488237219608445995072867798430614935403219495883835042862802917980856774134757390782052200512932375660858045003581611863121089979673784484701791210379500218604466721285456487387736825167702127154268533859979529612671925052419513844416493584817268143587955662039327860394141299238613042312035808541735213479394437496215520277526351425482512084759462579494878772787079101513841720202004639843443083454387175700954018825292148776647553122504118229978165851660083576570848983047255050145168802863168613110619584686348869690774233051669081248424584219383477237544209892290799448207462345346336076966775224683516220960618177284844330167142846351091001423033864986042919757795382577032341453971393897073354841924116635150129850119992031076354249371062307034564093077675129303383786693131843907104175619570678630497198824622804914508555467550904967368926176118094672479099827962889569753303773699017596074205893197641101210911874606040804983166177455705972192827752532495287749766682029353154226049380290040508900715169403153139668217790502306177709467234413947747673881158973344492079455405942662489751581189327200960698310350121179918845099840977270519116578719881752429190273998774113278822810866144521416958558406602325070095207349450759264393913367193083149679216066539911941983836313340998945139132421885688290888674594474605510238217590823316979504437667252929278291853368754482552573193289277120902144178425726693671235675042499401282016643202758246845332593475338220708351934511933096882598943512036679145593929114103343255708217768511665236173107020739195152050863630870948954052925049746246549772984384435109578859863612603574306739909728739428192798727373799081111333186135697868385292787575475482883660605162944306327057220313320376280182432763977906971557137715710757099478269250731209785404487629107297262798803645379809868663503452656912571816192881412782623078761411808958183665272686617730596943579533808499348879195167683064937591552734375 

हास्केल इतनी बड़ी संख्या और जावा जैसी अन्य भाषाओं की गणना क्यों कर सकता है (इतना आसानी से)?हास्केल आसानी से बहुत बड़ी संख्या क्यों संभाल सकता है?

उत्तर

25

जावा में BigInteger कक्षा है।

यह इस सुविधा को भाषा में बना सकता था, लेकिन (कई भाषाओं की तरह) यह प्राइमेटिव फीचर्स को सीपीयू द्वारा समर्थित चीजों पर बारीकी से नक्शा बनाने के लिए प्रेरित करता है।

दूसरी तरफ हास्केल गणितीय नोटेशन की शैली में अभिव्यक्ति पर जोर देता है, जहां "प्रदर्शन" विचार काफी हद तक अप्रासंगिक हैं।

+20

बस स्पष्ट होने के लिए, हालांकि: हास्केल डेवलपर्स सामान्य रूप से प्रदर्शन विचारों को अप्रासंगिक मानते हैं। – amindfv

+0

मैं सहमत हूं - मैंने "प्रदर्शन" के आसपास उद्धरण दिए हैं क्योंकि मैं हास्केल के दृष्टिकोण का समर्थन करता हूं। –

+1

वास्तविक जीवन में हास्केल कोड में, Int का उपयोग किया जाता है। इंटीजर का उपयोग तब किया जाता है जब आप जावा में बिगइंटर का उपयोग भी करेंगे। तो वास्तव में कोई व्यावहारिक अंतर नहीं है, सिवाय इसके कि हास्केल में, यदि आप किसी प्रकार को निर्दिष्ट नहीं करते हैं तो इंटीजर डिफ़ॉल्ट प्रकार है। (चूंकि यह [सही ढंग से] माना जाता है कि उत्पादन कोड नहीं होने के बावजूद किसी प्रकार को निर्दिष्ट नहीं किया गया है।) – Evi1M4chine

3

संक्षिप्त और मूल उत्तर यह है कि वे डिफ़ॉल्ट पूर्णांक differents को लागू करते हैं। जावा में, एक मानक int 32 बिट्स है। हस्ताक्षरित, जो आपको −2,147,483,648 से +2,147,483,647 की एक श्रृंखला देता है।

उस ने कहा, जावा में bignum कक्षाएं भी हैं। यदि आप उनका उपयोग करते हैं, तो आप मनमाने ढंग से बड़ी संख्याओं का उपयोग करने की क्षमता भी प्राप्त करेंगे।

0

यह संख्याओं को एन्कोड करने का विषय है। ऐसा करने का पारंपरिक तरीका किसी दिए गए बिट्स के साथ संख्याओं को एन्कोड करना है, जहां आपके पास अनंत सटीकता नहीं हो सकती है। हास्केल जाहिर है कि यह संख्या के लिए बिट्स की एक परिवर्तनीय संख्या के साथ ऐसा करता है जो कि ठीक है, लेकिन आमतौर पर इसका मतलब है कि सभी गणित सॉफ़्टवेयर में किए जाते हैं, क्योंकि हार्डवेयर त्वरण आमतौर पर केवल सटीक सटीकता के लिए उपलब्ध होता है।

+1

मुझे लगता है कि हैस्सेल लिस्प की तरह चिकनी रेंज जांच और संख्या रूपांतरण प्रदान करता है। जब तक आपकी संख्या फ़िक्सनम रेंज के अंदर रहती है, गणना सामान्य रूप से मशीन पर सामान्य रूप से की जाती है, लेकिन ओवरफ्लो का पता लगाया जाता है और बिग्नम में रूपांतरण द्वारा समाप्त किया जाता है। – Svante

+1

@Svante: नहीं, यह पूरी तरह से सच नहीं है। हास्केल के पास किसी भी प्रकार के बीच कोई स्वचालित रूपांतरण नहीं है और न ही इसमें इंट्स की रेंज जांच है। यह पूरी तरह अस्पष्ट प्रकार का मुद्दा है। हास्केल पूर्णांक अक्षरों में किसी भी प्रकार से टाइप किया जा सकता है जो संख्या को प्रस्तुत करता है। यहां प्रकार संदिग्ध है। डिफ़ॉल्ट रूप से, हास्केल इंटीजर को डिफ़ॉल्ट रूप से परिभाषित करता है, जैसा कि यहां बताया गया है: http://www.haskell.org/onlinereport/decls.html#default-decls – newacct

+1

@ न्यूवाक्ट: जबकि हास्केल रिपोर्ट इंटीग्रर्स व्यवहार के तरीके को परिभाषित करती है, इसका मतलब यह नहीं है उन्हें फिक्समम्स और बिग्नम के रूप में लागू नहीं किया जा सकता है। चाहे कोई हास्केल कार्यान्वयन हो जो वास्तव में ऐसा करता है, मुझे नहीं पता। –

0

आप एक ही चीज़ करने के लिए BigInteger का उपयोग कर सकते हैं। हास्केल एक कार्यात्मक भाषा है जो जावा से अधिक terse है।

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

+1

ghcjs के साथ अब यह एक बढ़िया विकल्प है! – Fresheyeball

6

जावा में "आदिम डेटा प्रकार" (जो प्रोसेसर का समर्थन करता है) की धारणा है और वे अन्य सभी वर्गों से अलग हैं।

हास्केल में, Int अन्य सभी प्रकार की तरह एक प्रकार है, और इसलिए यह आसानी से Num और Integral typeclasses (^) ("(^) :: (Num a, Integral b) => a -> b -> a") में प्रयोग किया जाता का एक सदस्य बनाया गया था। उन टाइपक्लास का एक अन्य सदस्य Integer है, जो सभी आकारों के पूर्णांक का समर्थन करता है (जब तक आपके अंकों के लिए पर्याप्त स्मृति हो)।

जावा में, आप कई "बड़ी संख्या" पुस्तकालयों का उपयोग कर सकते हैं, लेकिन उनके लिए ऑपरेशन उन इन्फिक्स ऑपरेटरों का उपयोग नहीं करेंगे जिनका उपयोग आप जावा में करते हैं, क्योंकि वे केवल जावा में "आदिम प्रकार" के लिए हैं।

+1

देखें कि क्या मैं इसे सही ढंग से समझता हूं। तो हास्केल में^ऑपरेटर सीधे एक विशिष्ट प्रकार से बंधे नहीं है, लेकिन एक "श्रेणी" (या दो ऐसी श्रेणियों, ऐसा लगता है) के प्रकार के रूप में कुछ अर्थों में समान व्यवहार करते हैं? क्या हास्केल फिर रनटाइम पर अभिव्यक्ति देने के लिए किस प्रकार का चयन करता है, लेकिन हमेशा ऐसी ही श्रेणी में? पोस्टर के उदाहरण के रूप में, 94535^445 के परिणाम को एक इंटीजर प्रकार का प्रतिनिधित्व करने की आवश्यकता होती है, लेकिन 3^5 का नतीजा एक इंटेल के साथ प्रदर्शित किया जा सकता है। – harms

+4

@harms: हास्केल संकलन समय टाइप करें और संकलन समय टाइप करें। इस मामले में, चूंकि कोई भी प्रकार की जानकारी प्रदान नहीं की जाती है, इसलिए यह 'इंटेगर' (जो जावा 'बिग नम्बर' की तरह है) के लिए डिफ़ॉल्ट होगी। हालांकि, आप यह कहने के लिए मैन्युअल रूप से टाइप जानकारी जोड़ सकते हैं कि संख्याएं 'Int' (जावा आदिम' int' की तरह हैं), उस स्थिति में '^' ऑपरेशन का परिणाम बस बह जाएगा और गलत 'Int' परिणाम देगा। –

1

जैसा कि पहले से ही बताया गया है, यदि आपके पास 32 बिट शब्द हैं और पूर्ण श्रेणी का उपयोग करते हैं तो आपको दो पूरक के उपयोग से -2^31 से 2^31-1 मिलते हैं।

शब्द के कुछ बिट्स को आरक्षित करके, उन बिट्स का उपयोग मूल्य के लिए प्रकार-जानकारी ले जाने के लिए किया जा सकता है। यही है, मूल्य रनटाइम पर अपने स्वयं के प्रकार "जानते हैं"। शेष बिट्स का उपयोग मूल्य के डेटा को ले जाने के लिए किया जाता है।

इन शेष बिट्स में फिट होने वाले पूर्णांक मान सीधे शब्द में संग्रहीत किए जा सकते हैं। ऐसे पूर्णांक को आम तौर पर 'फिक्समम्स' कहा जाता है। यदि वे फिट नहीं होते हैं, तो शब्द के प्रकार बिट्स इंगित करते हैं कि यह एक 'बिंटिंट' है, और शेष बिट्स को मेमोरी पॉइंटर को ढेर में संग्रहीत करने के लिए उपयोग किया जाता है जहां बिगंट मान संग्रहीत किया जाता है।

कंपाइलर को आपके अंकगणितीय अभिव्यक्तियों को कई कोड पथों में अनुवाद करने की आवश्यकता है जो ऑपरेटरों के लिए अनुमत प्रकार संयोजनों को कवर करते हैं। इसके अलावा के लिए उदाहरण:

  • fixnum + fixnum
  • bigint + fixnum
  • fixnum + bigint
  • bigint + bigint

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

+0

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

+0

सच है, अगर इसे अनुकूलित किया जा सकता है तो कोई रनटाइम ओवरहेड नहीं है। हास्केल (कम से कम जीएचसी) ओवरफ्लो (इंटीजर प्रकार के लिए) पर बिगिनटेर्स को फ़िक्समम्स का स्वचालित प्रचार करता है। वह जावा सिर्फ यह नहीं बताता कि क्यों प्राचीन int या इंटीजर ओवरफ्लो, बिगिनट के उपयोग की आवश्यकता होती है और लागत लेती है भले ही मूल्य फिक्सनम रेंज में फिट होगा। – Christian

10

संख्यात्मक शाब्दिक अतिभारित रहे हैं ताकि वे कई ठोस प्रकार का प्रतिनिधित्व कर सकते हैं (जैसे Int, Integer, Float या यहाँ तक कि MyOwnNumber)।

आप मैन्युअल रूप से तो जैसे, प्रकार की जानकारी उपलब्ध कराने के द्वारा एक विशिष्ट प्रकार चुना कर सकते हैं:

x = 4 :: Int 
y = 4 :: Integer 
z = 4 :: Float 

इन तीन मूल्यों विभिन्न प्रकार और संचालन इन पर प्रदर्शन अलग ढंग से व्यवहार करेंगे।

Int का सटीक आकार कार्यान्वयन पर निर्भर है लेकिन 28 बिट्स की तरह कुछ हो सकता है, यह प्रकार जावा आदिम int जैसा व्यवहार करता है, उदा। यह बह जाएगा।

एक Integer एक प्रकार है जिसमें जावा BigInteger जैसे मनमानी-सटीक पूर्णांक हो सकते हैं।

और Float फ़्लोटिंग पॉइंट अंकगणित का उपयोग करते हुए जावा float की तरह है।

संख्यात्मक अक्षर की तरह, कई ऑपरेटरों को भी अधिभारित किया जाता है (type classes का उपयोग करके), और विभिन्न प्रकारों के साथ इसका उपयोग किया जा सकता है। तो + ऑपरेटर Int एस और Float दोनों के साथ काम कर सकता है।

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

42

यह डिजाइन दर्शन में एक अंतर है:

  • हास्केल के डिजाइनरों यकीन है कि उपयोगकर्ताओं को एक पूर्णांक गणना से अधिक 32 बिट की आवश्यकता होगी, के उचित रूप में मनमाने ढंग से विफलता से हैरान नहीं किया जाएगा बनना चाहता था।

  • जावा के डिजाइनर यह सुनिश्चित करना चाहते थे कि उपयोगकर्ताओं को 32 बिट्स से अधिक की आवश्यकता वाले पूर्णांक पर बहुत अधिक गणना करने के कारण प्रतीत होता है कि मनमानी प्रदर्शन गिरावट से आश्चर्यचकित नहीं होगा।

प्रत्येक भाषा में, आपको अन्य प्रकार के पूर्णांक प्राप्त करने के लिए कुछ खास करना होगा।

डिफ़ॉल्ट रूप से मनमाने ढंग से बड़े पूर्णांक का समर्थन करने वाली भाषाओं का एक लंबा, सम्माननीय इतिहास है। मेरे दो पसंदीदा Icon और Smalltalk हैं, जो 25 वर्ष से अधिक आयु के हैं।

+10

हालांकि हास्केल में "कुछ विशेष" थोड़ा आसान है: इसका मतलब है कि जावा में जबकि आपके प्रकार के रूप में 'Int32' का उपयोग करना है, यह मेरी समझ है कि ऑपरेटर ओवरलोडिंग की कमी आपको' x 'जैसी चीजों को कहने के लिए मजबूर करेगी। .add (y) 'या' x.multiply (y) ' –

+2

सामान्य लिस्प ftw: डी –

+0

हाँ मुझे लगता है कि" कुछ विशेष "हास्केल के लिए बहुत अनुचित है। आप जावा में बाध्य int के रूप में कोड की एक ही राशि के साथ हास्केल में एक बाध्य int का उपयोग कर सकते हैं। 'int x = 5' बनाम 'x = 5 :: Int'। – semicolon

संबंधित मुद्दे