`1L` এবং` 1` এর মধ্যে পার্থক্য কী?


152

আমি প্রায়ই প্রতীক দেখা 1L(অথবা 2L, 3Lইত্যাদি) আর কোড প্রদর্শিত হয়। কী এর মধ্যে পার্থক্য 1Lএবং 1? 1==1Lমূল্যায়ন TRUE1Lআর কোডে কেন ব্যবহার হয়?


18
দ্রষ্টব্য: 1 == 1Lদেয় TRUE, কিন্তু identical(1, 1L)দেয় FALSE
সিজেবি

উত্তর:


129

সুতরাং, @ জেমস এবং @ ব্রায়ান 3 এল এর অর্থ কী তা ব্যাখ্যা করেছে । তবে কেন আপনি এটি ব্যবহার করবেন?

বেশিরভাগ সময় এটি কোনও তাত্পর্যপূর্ণ করে না - তবে কখনও কখনও আপনি আপনার কোডটি দ্রুত চালানোর জন্য এবং কম স্মৃতিশক্তি গ্রহণ করতে এটি ব্যবহার করতে পারেন । একটি ডাবল ("সংখ্যাসূচক") ভেক্টর প্রতি উপাদানটিতে 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!

... এবং @ গ্যাভিন উল্লেখ করেছেন যে, পূর্ণসংখ্যার জন্য পরিসীমা মোটামুটি -2e9 থেকে 2e9।

যদিও একটি সতর্কতাই এটি বর্তমান আর সংস্করণে প্রযোজ্য (2.13) 13 এটি কোনও সময়ে এটি পরিবর্তন করতে পারে (-৪-বিট পূর্ণসংখ্যার মিষ্টি হবে, যা দৈর্ঘ্যের ভেক্টরগুলিকে> 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
@ জ্যাখ এটি টাইপ করতেও অনেক খাটো :-)
গ্যাভিন সিম্পসন

1
@ গ্যাভিন সিম্পসন অবশ্যই আমি সত্যিই অবস্থা যেখানে আপনি একটি সম্পূর্ণ ভেক্টর তৈরি করেন, মত চিন্তা ছিল c(1L, 2L, 3L, 4L,...100L)বনাম as.integer(c(1, 2, 3, 4,...100))
জাচ

54

থেকে ধ্রুবক অনুচ্ছেদ এর আর ভাষা সংজ্ঞা :

আমরা 'এল' প্রত্যয়টি যেকোন সংখ্যাকে স্পষ্ট পূর্ণসংখ্যার উদ্দেশ্যে তৈরি করতে সক্ষম করতে ব্যবহার করতে পারি। সুতরাং '0x10L' হেক্সাডেসিমাল উপস্থাপনা থেকে পূর্ণসংখ্যার মান 16 তৈরি করে। ধ্রুবক 1e3L সংখ্যার মানের চেয়ে 1000 কে পূর্ণসংখ্যা হিসাবে দেয় এবং 1000L এর সমতুল্য। (দ্রষ্টব্য যে 'এল' টিটি 1e3 শব্দটির যোগ্যতা হিসাবে বিবেচিত হবে এবং 3 নয় not) আমরা যদি 'L' এর সাথে কোনও পূর্ণসংখ্যার মান নয়, উদাহরণস্বরূপ 1e-3L এর সাথে মানটি যোগ্যতা অর্জন করি তবে আমরা একটি সতর্কতা পাই এবং সংখ্যার মানটি হয় সৃষ্টি করেছেন। সংখ্যায় অপ্রয়োজনীয় দশমিক পয়েন্ট থাকলে উদাহরণস্বরূপ 1.L. একটি সতর্কতা তৈরি করা হয় 1.


46

এল স্ট্যান্ডার্ড সংখ্যাসূচক শ্রেণীর দ্বিগুণের চেয়ে পূর্ণসংখ্যার ধরণ নির্দিষ্ট করে।

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

2

ধ্রুবকটির জন্য স্পষ্টভাবে একটি পূর্ণসংখ্যার মান তৈরি করতে আপনি ফাংশনটিকে as.integer বলতে পারেন বা আরও সহজেই "এল" প্রত্যয় ব্যবহার করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.