Crystal में अलग-अलग ज़रूरतों के लिए कई तरह के संख्या टाइप होते हैं। जैसे, कुछ टाइप बाकी टाइपों से तेज़ होते हैं, लेकिन उनमें संभावित वैल्यू की रेंज कम होती है। कुछ टाइपों में संभावित वैल्यू की रेंज ज़्यादा होती है, पर वे धीमे होते हैं।
Crystal में चिह्नित और अचिह्नित, दोनों तरह के पूर्णांक टाइप होते हैं। चिह्नित पूर्णांक टाइप धनात्मक या ऋणात्मक हो सकते हैं। अचिह्नित पूर्णांक टाइप केवल धनात्मक हो सकते हैं।
Crystal में ये चिह्नित पूर्णांक टाइप हैं:
| टाइप | आकार (बिट में) | रेंज |
|---|---|---|
Int8 |
8 | -128 से 127 तक |
Int16 |
16 | -32_768 से 32_767 तक |
Int32 |
32 | -2_147_483_648 से 2_147_483_647 तक |
Int64 |
64 | -9_223_372_036_854_775_808 से 9_223_372_036_854_775_807 तक |
Int128 |
128 | -170_141_183_460_469_231_731_687_303_715_884_105_728 से 170_141_183_460_469_231_731_687_303_715_884_105_727 तक |
छोटे टाइप बड़े टाइपों से कम मेमोरी लेते हैं और तेज़ होते हैं, लेकिन उनमें संभावित वैल्यू की रेंज कम होती है।
जब आपको पता हो कि वैल्यू एक तय रेंज के अंदर ही रहेगी, तो मेमोरी बचाने और परफॉर्मेंस बेहतर करने के लिए सबसे छोटा टाइप इस्तेमाल करना ही सबसे अच्छा है।
डिफॉल्ट पूर्णांक टाइप Int32 है।
किसी खास टाइप का पूर्णांक घोषित करने के लिए आप <number>_I <bit> लिखकर टाइप के नाम को सफिक्स की तरह इस्तेमाल कर सकते हैं।
1_i8.class
# => Int8
अलग-अलग पूर्णांक टाइपों के बीच बदलने के लिए आप to_i<bit> मेथड इस्तेमाल कर सकते हैं।
to_i मेथड डिफॉल्ट पूर्णांक टाइप, Int32, में बदलता है।
1_i8.to_i16.class
# => Int16
2_i16.to_i.class
# => Int32
Crystal में ये अचिह्नित पूर्णांक टाइप हैं:
UInt8, UInt16, UInt32, UInt64, UInt128
चिह्नित और अचिह्नित पूर्णांकों में बस एक ही अंतर है: अचिह्नित पूर्णांक केवल धनात्मक हो सकते हैं।
किसी खास टाइप का अचिह्नित पूर्णांक घोषित करने के लिए आप <number>_u<bit> लिखकर टाइप के नाम को सफिक्स की तरह इस्तेमाल कर सकते हैं।
अलग-अलग अचिह्नित पूर्णांक टाइपों के बीच बदलने के लिए आप to_u<bit> मेथड इस्तेमाल कर सकते हैं।
to_u मेथड डिफॉल्ट अचिह्नित पूर्णांक टाइप, UInt32, में बदलता है।
1_u8.to_u16.class
# => UInt16
Crystal में ये दशमलव संख्या टाइप हैं:
| टाइप | आकार (बिट में) | रेंज |
|---|---|---|
Float32 |
32 | 1.2E-38 से 3.4E+38 तक |
Float64 |
64 | 2.3E-308 से 1.7E+308 तक |
दो अलग-अलग दशमलव संख्या टाइप होते हैं, जिनमें एक दूसरे से ज़्यादा सटीक होता है।
डिफॉल्ट दशमलव संख्या टाइप Float64 है।
अलग-अलग दशमलव संख्या टाइपों के बीच बदलने के लिए आप to_f<bit> मेथड इस्तेमाल कर सकते हैं।
to_f मेथड डिफॉल्ट दशमलव संख्या टाइप, Float64, में बदलता है।
ESA (Exercism Space Agency) मंगल के एक चाँद Phobos पर एक नया मिशन भेजने की योजना पूरी रफ्तार से बना रहा है। इस मिशन का उद्देश्य Phobos की सतह पर एक प्रोब उतारना और सतह के बारे में जानकारी वापस भेजना है। ESA ने प्रोब के लिए नेविगेशन कंप्यूटर बनाने में आपकी मदद माँगी है। नेविगेशन कंप्यूटर की मेमोरी सीमित है, इसलिए हमें मेमोरी का उपयोग जितना कम हो सके उतना कम रखना है। इसलिए हमें ऐसे डेटा टाइप इस्तेमाल करने हैं जो इस काम के लिए उपयुक्त हों।
सही गणनाएँ करने के लिए नेविगेशन कंप्यूटर को अंतरिक्ष में कुछ वस्तुओं के बीच की दूरी पता होनी चाहिए। यह दूरी किलोमीटर में मापी जाती है।
इन कॉन्स्टेंट को परिभाषित कीजिए:
NEPTUNE_DISTANCE जिसकी वैल्यू 4_400_000_000 है, इसे Int64 के रूप में संग्रहीत करना हैMARS_DISTANCE जिसकी वैल्यू 227_940_000 है, इसे Int32 के रूप में संग्रहीत करना हैATMOSPHERE_DISTANCE जिसकी वैल्यू 10_000 है, इसे Int16 के रूप में संग्रहीत करना हैसही गणनाएँ करने के लिए नेविगेशन कंप्यूटर को अंतरिक्ष में कुछ वस्तुओं का क्षेत्रफल पता होना चाहिए। क्षेत्रफल ऋणात्मक नहीं हो सकता। इंजीनियरों ने प्रोग्राम ऐसा बनाने की योजना बनाई थी कि क्षेत्रफल के ऋणात्मक होने पर ओवरफ्लो एरर आए। लेकिन इंजीनियर साइन्ड पूर्णांक को अनसाइन्ड पूर्णांक में बदलना भूल गए।
इसलिए इंजीनियर चाहते हैं कि प्रोग्राम साइन्ड पूर्णांक को अनसाइन्ड पूर्णांक में बदल दे।
Navigation#correct_area_analysis मेथड लागू कीजिए जो एक आर्गुमेंट के रूप में measurement लेता है और क्षेत्रफल को 32 बिट वाले अनसाइन्ड पूर्णांक के रूप में लौटाता है।
दिया गया क्षेत्रफल हमेशा 32 बिट वाले अनसाइन्ड पूर्णांक में समा जाएगा।
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
नेविगेशन कंप्यूटर को प्रोब का वेग पता होना चाहिए। वेग m/s में मापा जाता है।
वेग निकालने के लिए हमें तय की गई दूरी और उस दूरी को तय करने में लगा समय पता होना चाहिए। फिर दूरी को समय से भाग दीजिए।
वेग बिल्कुल सटीक नहीं भी हो सकता है, और यह कभी बहुत बड़ी संख्या नहीं होगा।
इसलिए हम एक Float32 इस्तेमाल कर सकते हैं।
Navigation#calculate_velocity मेथड लागू कीजिए जो distance और time को आर्गुमेंट के रूप में लेता है और वेग को 32 बिट वाले Float के रूप में लौटाता है।
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32
Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।