`1L` और` 1` में क्या अंतर है?


152

मैं अक्सर प्रतीक देखा 1L(या 2L, 3L, आदि) आर कोड में दिखाई देते हैं। क्या बीच का अंतर 1Lऔर 1? 1==1Lका मूल्यांकन करता है TRUE1Lआर कोड में क्यों उपयोग किया जाता है?


18
नोट: 1 == 1Lदेता है TRUE, लेकिन identical(1, 1L)देता है FALSE
CJB

जवाबों:


129

तो, @ जेम्स और @ ब्रायन ने समझाया कि 3L का क्या मतलब है। लेकिन आप इसका इस्तेमाल क्यों करेंगे?

अधिकांश समय इससे कोई फ़र्क नहीं पड़ता - लेकिन कभी-कभी आप इसका उपयोग अपने कोड को तेज़ी से चलाने और कम मेमोरी का उपभोग करने के लिए कर सकते हैं । एक डबल ("संख्यात्मक") वेक्टर प्रति तत्व 8 बाइट्स का उपयोग करता है। एक पूर्णांक वेक्टर केवल 4 बाइट्स प्रति तत्व का उपयोग करता है। बड़े वैक्टर के लिए, यह कम बर्बाद की गई मेमोरी और सीपीयू के माध्यम से कम करने के लिए कम है (इसलिए यह आमतौर पर तेज है)।

ज्यादातर यह सूचकांक के साथ काम करते समय लागू होता है। यहां एक उदाहरण दिया गया है जहां पूर्णांक वेक्टर में 1 जोड़ना एक डबल वेक्टर में बदल जाता है:

x <- 1:100
typeof(x) # integer

y <- x+1
typeof(y) # double, twice the memory size
object.size(y) # 840 bytes (on win64) 

z <- x+1L
typeof(z) # still integer
object.size(z) # 440 bytes (on win64) 

... लेकिन यह भी ध्यान दें कि पूर्णांकों के साथ अत्यधिक काम करना खतरनाक हो सकता है:

1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!

... और जैसा @Gavin ने बताया, पूर्णांक के लिए सीमा लगभग -2e9 से 2e9 है।

एक चेतावनी यह है कि यह वर्तमान आर संस्करण (2.13) पर लागू होता है। कुछ बिंदु पर यह बदल सकता है (64-बिट पूर्णांक मधुर होंगे, जो लंबाई के वैक्टर को सक्षम कर सकते हैं> 2e9)। सुरक्षा के लिए, आप का उपयोग करना चाहिए .Machine$integer.max, जब भी आप अधिकतम पूर्णांक मान (और निगेट न्यूनतम के लिए कि) की जरूरत है।


1
मुझे लगता है कि आर द्वारा मेमोरी की आवश्यकताएं समान प्रकार की हैं, कम से कम उसी के अनुसार object.size। यह फोरट्रान या सी कोड के लिए उपयोगी है जो किसी विशेष प्रकार के डेटा की आवश्यकता हो सकती है।
जेम्स

2
नहीं, कोशिश करो object.size(1:100)बनाम object.size(1:100+0)यह 400 बाइट्स है + कुछ ओवरहेड बनाम 800 बाइट्स + कुछ ओवरहेड। मैंने ऊपर का उदाहरण अपडेट किया।
टॉमी

2
वर्थ उल्लेख है कि पूर्णांक ओवरफ़्लो 32-बिट हस्ताक्षरित पूर्णांक का उपयोग करने के कारण है, इसलिए लगभग +/- 2 * 10 ^ 9 तक सीमित है, यहां तक ​​कि 64-बिट आर पर भी ...
गेविन सिम्पसन

1
@Zach भी टाइप करने के लिए बहुत छोटा है :-)
गेविन सिम्पसन

1
@ गेविन सिम्पसन बेशक। मैं वास्तव में उस स्थिति के बारे में सोच रहा था जहां आप c(1L, 2L, 3L, 4L,...100L)बनाम जैसे एक संपूर्ण वेक्टर बनाते हैं as.integer(c(1, 2, 3, 4,...100))
Zach

54

आर भाषा परिभाषा के स्थिरांक अनुभाग से :

हम किसी स्पष्ट संख्या को पूर्णांक बनाने के इरादे से किसी भी संख्या को अर्हता प्राप्त करने के लिए 'L' प्रत्यय का उपयोग कर सकते हैं। इसलिए '0x10L' हेक्साडेसिमल प्रतिनिधित्व से पूर्णांक मान 16 बनाता है। स्थिर 1e3L संख्यात्मक मान के बजाय पूर्णांक के रूप में 1000 देता है और 1000L के बराबर होता है। (ध्यान दें कि 'L' को 1e3 शब्द को अर्हता प्राप्त करने के रूप में माना जाता है और 3. नहीं।) यदि हम 'L' के साथ एक मान को अर्हता प्राप्त करते हैं जो पूर्णांक मान नहीं है, जैसे 1e-3L, तो हमें एक चेतावनी और संख्यात्मक मान प्राप्त होता है। बनाया था। संख्या में अनावश्यक दशमलव बिंदु होने पर चेतावनी भी बनाई जाती है, जैसे 1.L.


46

एल एक पूर्णांक प्रकार को निर्दिष्ट करता है, बजाय एक डबल के कि मानक संख्यात्मक वर्ग है।

> str(1)
 num 1
> str(1L)
 int 1

2

किसी फ़ंक्शन के लिए पूर्णांक मान को स्पष्ट रूप से बनाने के लिए आप फ़ंक्शन को as.integer कह सकते हैं या अधिक "L" प्रत्यय का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.