কেন এতগুলি সংখ্যক প্রকার (বিট, ইনট, ফ্লোট, ডাবল, লম্বা) রয়েছে?


9

আমি পিএইচপি, জাভা এবং সি শিখেছি এখন বিট, ইনট, ফ্লোট, ডাবল এবং লম্বা জাতীয় সংখ্যার ডেটা ধরণের কেন রয়েছে তা সম্পর্কে আমি আগ্রহী। সংখ্যার জন্য শুধুমাত্র একটি প্রকার তৈরি করবেন না কেন?

এতে কি কোনও লাভ আছে? আমরা যদি সংখ্যার মতো সংখ্যক সংখ্যক ধারণ করতে পূর্ণসংখ্যা ব্যবহার করি তবে আমরা স্মৃতি বাঁচাতে পারি?


6
হুরাসকলের উত্তর ছাড়াও: 'ভাসা' এবং 'পূর্ণসংখ্যার' প্রকারগুলি সহজাতভাবে পৃথক। ভাসমানগুলি খুব বড় সংখ্যক ধরে রাখতে পারে, তবে সংখ্যার আকার বাড়ার সাথে সাথে নির্ভুলতা নীচে নেমে যায়। এই অনর্থকতাটি যেভাবে ফ্লোটগুলি সংরক্ষণ করা হয় তার কারণেই। বিপরীতে, আপনি একটি পূর্ণসংখ্যার মধ্যে যে মানগুলি সংরক্ষণ করতে পারেন তার পরিসরটি বেশ সীমাবদ্ধ তবে মানটি সর্বদা যথাযথ, তাই আপনি মানগুলি তুলনায় আরও সহজ করতে পারেন। এছাড়াও, বিভাগের সাথে দুটি ভিন্ন ধরণের আচরণ রয়েছে - নিকটস্থ পুরো সংখ্যায় স্বয়ংক্রিয়ভাবে পূর্ণসংখ্যার 'কাটা', ভাসমান হয় না। এই প্রতিটি আচরণ বিভিন্ন পরিস্থিতিতে কার্যকর for
কাম্পু

জাভাস্ক্রিপ্টের কেবল পৃষ্ঠের উপরে এক নম্বর প্রকার রয়েছে।
ইসাইলিজা

@ ক্যাম্পু: আসলে, অনেক ভাষায়, পূর্ণসংখ্যা যতক্ষণ না কোনও সংখ্যা সংরক্ষণ করতে পারে যতক্ষণ না (ভার্চুয়াল) মেমরিটি এটি উপস্থাপনের পক্ষে যথেষ্ট বড় হয়।
জার্গ ডব্লু মিত্তাগ

1
@ জার্গডব্লিউমিত্যাগ: তবে, এই প্রশ্নকর্তা স্পষ্টতই পাইথনের মতো গতিশীল ভাষা নয়, স্থির ভাষা সম্পর্কে কথা বলছেন। সিপিথন নিজেই 'সীমাহীন ব্যাপ্তি' পূর্ণসংখ্যাকে 32 বিট ইনটগুলির অ্যারের হিসাবে প্রয়োগ করে, আরও প্রতিটি বিট যেতে হবে কিনা তা বোঝাতে প্রতিটি ইন্টে চূড়ান্ত বিট ব্যবহার করা হয়। এছাড়াও, পূর্ণসংখ্যা কেবল যে কোনও সম্পূর্ণ সংখ্যা সঞ্চয় করতে পারে । এর অর্থ হ'ল অসীম স্টোরেজ সহ একটি ভাসা মানগুলি যথার্থতার জন্য সঞ্চয় করতে পারে (অনন্ত আলিফ এক), যখন পূর্ণসংখ্যা কেবল নির্ভুলতার জন্য মূল্যগুলি সঞ্চয় করতে পারে ( ইনফিনিটি এলেফ শূন্য )।
কাম্পু 26'13

@ ক্যাম্পু: যেহেতু সমস্ত সংখ্যা বিটগুলির দ্বারা সিরিজ বিট দ্বারা উপস্থাপিত হয়, এমনকি অসীম স্টোরেজ সহ, ভাসমান পয়েন্ট সংখ্যা এবং পূর্ণসংখ্যার মধ্যে সর্বদা এক থেকে এক ম্যাপিং থাকবে। সুতরাং আমি মনে করি না যে আলিফের কাছে প্রশ্ন আসে।
আসুন

উত্তর:


17

বিভিন্ন সংখ্যক ডেটা ধরণের সাথে আপনার কেন উদ্বিগ্ন হওয়ার দুটি কারণ রয়েছে।

1. স্মৃতি সংরক্ষণ করা

for(long k=0;k<=10;k++)
{
    //stuff
}

কেন এটি দীর্ঘ ব্যবহার করতে পারে যখন এটি ঠিক সহজেই পূর্ণসংখ্যার, বা বাইট হতে পারে? আপনি আসলে মেমরির কিছু বাইট সংরক্ষণ করে তা করে।

২.ফ্লোটিং পয়েন্ট নম্বর এবং পূর্ণসংখ্যার নম্বর কম্পিউটারে আলাদাভাবে সংরক্ষণ করা হয়

ধরা যাক আমরা একটি পূর্ণসংখ্যার মধ্যে 22 নম্বর সঞ্চিত আছে। কম্পিউটার এই সংখ্যাটি মেমরিতে বাইনারি হিসাবে সংরক্ষণ করে:

0000 0000 0000 0000 0000 0000 0001 0110

আপনি যদি বাইনারি নম্বর সিস্টেমের সাথে পরিচিত না হন তবে এটি বৈজ্ঞানিক স্বরলিপি হিসাবে প্রতিনিধিত্ব করতে পারে: 2 ^ 0 * 0 + 2 ^ 1 * 1 + 2 ^ 2 * 1 + 2 ^ 3 * 0 + 2 ^ 4 * 1 + 2 ^ 5 * 0 + ... + 2 ^ 30 * 0। সংখ্যাটি নেতিবাচক কিনা তা চিহ্নিত করতে শেষ বিটটি ব্যবহৃত হতে পারে বা নাও (ডাটা টাইপ স্বাক্ষরিত বা স্বাক্ষরিত না হলে নির্ভর করে)।

মূলত, এটি কেবলমাত্র 2 ^ (বিট স্থান) * মানের একটি যোগফল।

আপনি দশমিক বিন্দুতে জড়িত মানগুলি উল্লেখ করার সময় এই পরিবর্তন হয়। ধরুন আপনার দশমিক দশমিক ৩75 নম্বর রয়েছে। এটি বাইনারি 11.11 হিসাবে উল্লেখ করা হয়। আমরা এটিকে বৈজ্ঞানিক স্বরলিপি হিসাবে 2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1 বা সাধারণীকরণ হিসাবে 1.111 * 2 ^ 2 হিসাবে উপস্থাপন করতে পারি

কম্পিউটার এটি সংরক্ষণ করতে পারে না: এটিতে বাইনারি পয়েন্টটি প্রকাশ করার কোনও স্পষ্ট পদ্ধতি নেই (দশমিক পয়েন্টের বাইনারি সংখ্যা সিস্টেম সংস্করণ)। কম্পিউটারটি কেবল 1 এবং 0 এর স্টোর রাখতে পারে। এখানেই ভাসমান পয়েন্টের ডেটা টাইপ আসে।

আকার (ফ্লোট) 4 বাইট হিসাবে ধরে নেওয়া হয়, তারপরে আপনার কাছে মোট 32 বিট রয়েছে। প্রথম বিটটি "সাইন বিট" বরাদ্দ করা হয়। কোনও স্বাক্ষরবিহীন ফ্লোট বা ডাবলস নেই। পরবর্তী 8 টি বিট "অভিযাত্রী" এবং চূড়ান্ত 23 বিটগুলি "হিপেনড" (বা কখনও কখনও ম্যান্টিসার হিসাবে পরিচিত) হিসাবে ব্যবহৃত হয়। আমাদের ৩.75৫ উদাহরণ ব্যবহার করে, আমাদের সূচকটি 2 ^ 1 হবে এবং আমাদের তাত্পর্যটি 1.111 হবে।

প্রথম বিটটি যদি 1 হয় তবে সংখ্যাটি নেতিবাচক। যদি না হয় তবে ইতিবাচক। "বেইস" নামক কিছু দ্বারা এক্সপোনেন্টটি সংশোধন করা হয়, তাই আমরা সহজেই "0000 0010" কে घाষ্টাকার হিসাবে সঞ্চয় করতে পারি না। একক নির্ভুলতা ভাসমান পয়েন্ট সংখ্যাটির পক্ষপাত 127 এবং ডাবল নির্ভুলতার জন্য পক্ষপাত (এটি এখানে ডাবল ডেটাটাইপটির নাম হয়) 1023. চূড়ান্ত 23 বিটগুলি তাৎপর্যের জন্য সংরক্ষিত। তাৎপর্য হ'ল আমাদের বাইনারি পয়েন্টের রাইটের মানগুলি।

আমাদের সূচকটি বায়াস (127) + এক্সপোনেন্ট (1) বা বাইনারি হিসাবে উপস্থাপিত হবে

1000 0000

আমাদের তাত্পর্যটি হ'ল:

111 0000 0000 0000 0000 0000

সুতরাং, 3.75 হিসাবে প্রতিনিধিত্ব করা হয়:

0100 0000 0111 0000 0000 0000 0000 0000

এখন, আসুন 8 নম্বরটি ভাসমান পয়েন্ট সংখ্যা এবং পূর্ণসংখ্যার সংখ্যা হিসাবে প্রতিনিধিত্ব করুন:

0100 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1000

কীভাবে কম্পিউটারে কম্পিউটার 8.0 এবং 8 যুক্ত করতে চলেছে? বা এমনকি তাদের গুণ !? কম্পিউটারে (আরও নির্দিষ্টভাবে, x86 কম্পিউটার) সিপিইউর বিভিন্ন অংশ রয়েছে যা ভাসমান পয়েন্ট সংখ্যা এবং পূর্ণসংখ্যার সংখ্যা যুক্ত করে।


3
3) যদিও খুব কমই একটি সমস্যা: কম্পিউটারের শব্দ আকারের চেয়ে বড় সংখ্যায় অপারেশনগুলি ধীর হয়।
লরেন পেচটেল

6

আমাদের গিগাবাইট সিস্টেম থাকার আগে (বা আরডুইনোর মতো আধুনিক এমবেডেড সিস্টেমে) মেমরি ছিল একটি প্রিমিয়ামে এবং তাই কোনও নির্দিষ্ট নম্বর কতটা মেমরি গ্রহণ করবে তা নির্দিষ্ট করার জন্য শর্টহ্যান্ড পদ্ধতিগুলি প্রয়োগ করা হয়েছিল - বিআইটি সোজা - এটি মূলত মাত্র 1 বিট দখল করবে স্মৃতি।

অন্যান্য ডেটা মাপ এবং নামগুলি সিস্টেমের মধ্যে পরিবর্তিত হয়। একটি 32-বিট সিস্টেমে INT (বা মিডিয়ামট) সাধারণত 2 বাইট, লংগিন্টটি 4 বাইট এবং SMALLINT একক বাইট হবে। -৪-বিট সিস্টেমে 8-বাইটে লংগিন্ট সেট থাকতে পারে।

এখনই - বিশেষত ডাটাবেস অ্যাপ্লিকেশনগুলিতে, বা প্রোগ্রামগুলিতে যেগুলি সার্ভারে একাধিক উদাহরণ রয়েছে (ওয়েবসাইটগুলিতে সার্ভার সাইড স্ক্রিপ্টগুলির মতো) - আপনি যা পছন্দ করেন সে সম্পর্কে আপনার যত্নবান হওয়া উচিত। আপনার যদি কয়েক মিলিয়ন রেকর্ড সহ ডাটাবেস টেবিল থাকে তবে 0 এবং 100 এর মধ্যে মানগুলি (যা একটি বাইটে ফিট করতে পারে) সংরক্ষণ করতে 2, 4, বা 8-বাইট প্রশস্ত পূর্ণসংখ্যা বাছাই অবিশ্বাস্যরকম অপচয়যোগ্য।

আরও তথ্য: https://en.wikedia.org/wiki/Integer_( কম্পিউটার_সায়েন্স)


সুন্দর উত্তর +1।
বিনয়

7
কেবল 'পিছনে আগে' নয়, 'এখন যখন সিস্টেম ছোট হয়'। একটি ডিভাইসে আরডুইনোর আকারটি অর্থনৈতিক হতে হবে।
9000

1
কোন সিস্টেমটি কেবলমাত্র 1 বিট ব্যবহার করে কিছুটা সঞ্চয় করেছিল? বিটগুলি সাধারণত সরাসরি ঠিকানাযোগ্য হয় না
জে কে।

1
এটি অনেকগুলি আর্কিটেকচারে সত্য - তবে বিটগুলি সত্যই পুরানো সিস্টেমে সরাসরি সম্বোধনযোগ্য ছিল, এবং আরও কিছু সাম্প্রতিক এম্বেডেড সিস্টেমে (কিছু নিয়ন্ত্রক যাদের আমি মাত্র 10 বছর আগে প্রোগ্রাম করেছিলেন বিটগুলি নিয়ে কাজ করেছিলেন - যাদের কেবলমাত্র নির্দিষ্ট প্রস্থের প্রায় 64 টি ঠিকানাযুক্ত অবস্থান ছিল)। আজকাল, আমি অনুমান করি যে সংকলকগুলি এটির কাজ করে এবং এগুলি বাইট-অ্যারেতে রাখে।
হুরুসকোল

আমি মনে করি যে ওভাররাইডিং ফ্যাক্টরটি মেমরির উদ্বেগের চেয়ে সিপিইউ ক্ষমতা এবং পারফরম্যান্স
জেমস

4

মেমরির ঘাটতি এবং নির্ভুলতা এবং পরিসীমা বাণিজ্য বন্ধ সম্পর্কে সিএমপিজেআর 123 এর দুর্দান্ত পয়েন্টগুলি ছাড়াও, থারগুলিও সম্ভবত সিপিইউ বাণিজ্য বন্ধ।

বেশিরভাগ আধুনিক মেশিনে এফপিইউ নামক ফ্লোটিং পয়েন্ট অপারেশন করার জন্য বিশেষ হার্ডওয়্যার থাকে। এমন কিছু সিস্টেম রয়েছে যেগুলিতে এফপিইউ নেই (আজকাল এগুলি সাধারণত ছোট এমবেডেড ডিভাইস হয়) ফলস্বরূপ, আপনার টার্গেট হার্ডওয়ারের উপর নির্ভর করে আপনাকে হয় ভাসমান পয়েন্টের ধরণগুলি একেবারেই ব্যবহার করতে হবে না বা কোনও সফ্টওয়্যার ভাসমান পয়েন্ট লাইব্রেরি ব্যবহার করতে হবে না। এমনকি যদি আপনার মেশিনে কোনও এফপিইউ থাকে তবে এটি কোন ফাংশন সরবরাহ করতে পারে তার মধ্যে historতিহাসিকভাবে পার্থক্য ছিল। হার্ডওয়্যারে না করা কোনও ক্রিয়াকলাপ সফ্টওয়্যারেই করতে হবে (বা এড়ানো)

সফ্টওয়্যারটিতে ফ্লোটিং পয়েন্ট গণনা করা হার্ডওয়্যার সমর্থন করে এমন অনেকগুলি সহজ অপারেশন করেই করা হয়। আপনি অতএব পাশাপাশি একটি সম্ভাব্য গতি বাণিজ্য বন্ধ পেতে।


4

সম্ভবত সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল সত্যই তিনটি বিভিন্ন বেসিক সংখ্যার প্রকার রয়েছে।

পূর্ণসংখ্যা, স্থির দশমিক এবং ভাসমান পয়েন্ট।

তারা সকলেই আলাদা আচরণ করে।

7/2 এর মতো একটি সাধারণ ক্রিয়াকলাপ ব্যবহৃত ডেটা টাইপের উপর নির্ভর করে 3, 3.50 এবং 3.499 এর উত্তর দিতে পারে।

"স্থির দশমিক" সিন্ডারেলা ধরণ, এটি কেবল সিওবিএল এবং ভিজ্যুয়াল বেসিকের মতো কয়েকটি ভাষায় স্থানীয়ভাবে সমর্থিত। কম্পিউটার বিজ্ঞানীদের কাছে এটি খুব আগ্রহী নয় তবে যে কোনও অ্যাকাউন্টের সেট জমা দেওয়া বা চালানের উপর বিক্রয় কর গণনা করা যে কারও পক্ষে অতীব গুরুত্বপূর্ণ।


আমি এগুলি আলাদাভাবে পৃথক করব: পৃথক সংখ্যা, আনুমানিক সংখ্যা এবং বীজগণিতের রিং মোড়ানো। সি বৈশিষ্টসূচক উদাহরণ হবে int, floatএবং unsigned intযথাক্রমে। ফিক্সড-পয়েন্ট টাইপগুলি বিচ্ছিন্ন প্রকারের একটি উপশ্রেণীশ্রেণী, তবে বীজগণিতের রিংগুলি মূলত সংখ্যার চেয়ে পৃথক হয় [সি স্টেমের স্বাক্ষরযুক্ত প্রকারের বিষয়ে বিভ্রান্তির বিষয়টি অবশ্যই এই যে যে তারা বেশিরভাগ সংখ্যার চেয়ে রিংয়ের মতো আচরণ করে তবে বেশ সামঞ্জস্যপূর্ণ নয়] ।
সুপারক্যাট

3

তারা কি এটি উপকার করে?

অবশ্যই. সুবিধা আছে। কম্পিউটারের জগতে মেমরিটি বিবেচনা করা সবচেয়ে গুরুত্বপূর্ণ বিষয়। ডাটা 1kb এরও কম ফিট করতে পারলে 2kb এর মেমোরি ব্যবহার কী? । অপ্টিমাইজেশন থাকা উচিত। আপনি যদি আরও মেমরি ব্যবহার করেন তবে এটি অবশ্যই আপনার কম্পিউটারের গতিটিকে এক পর্যায়ে মেরে ফেলবে। আপনি কি এটি পেতে চান? কোন অধিকার...?

int - 2 bytes (16 bits)

long - 4 bytes (32 bits)

long long - 8 bytes (64 bits)

float - 4 bytes

কেবল মেমরিই নয় সেখানে বিভিন্ন ধরণের সংখ্যার সংগঠনও রয়েছে। একটি উদাহরণ ভাসমান পয়েন্ট জন্য। স্পষ্টতা অনেক গুরুত্বপূর্ণ এবং স্পষ্টতই আমাদের এক ধরণের থাকা উচিত যা আমাদের আরও নির্ভুলতা দিতে পারে।

যদি আমরা পুরানো দিনগুলি বিবেচনা করি তবে আমাদের জানা স্মৃতি খুব কম ছিল you এটি সংরক্ষণ এবং বিজ্ঞতার সাথে এটি ব্যবহার করার জন্য আমাদের এই পার্থক্য ছিল। এবং আরও অনেক কিছু যদি আপনি কেবল গুগল দিয়ে অনুসন্ধান করার জন্য কিছু চেষ্টা করেন .. আশা করি এটি সহায়তা করবে।


3

পূর্ণসংখ্যা এবং আসল (ভাসমান, ডাবল) সংখ্যাগুলি ক্রিয়াকলাপের বিভিন্ন সেট যা বিভিন্ন সেট অপারেশন এবং স্বতন্ত্র বৈশিষ্ট্য সহ।

পূর্ণসংখ্যাগুলি অগণনীয় তবে ভাসমানগুলি নয় etc.

প্রকৃতপক্ষে ফ্লোট / ডাবল সংখ্যা হ'ল একটি কাঠামো যা দুটি পূর্ণসংখ্যার ক্ষেত্রগুলিকে একত্রিত করে: ম্যান্টিসা এবং ঘাতক। জটিল সংখ্যা (যা আপনি বিবেচনার বাইরে রেখেছেন) আরও বেশি, ভাল, জটিল।

যে কোনও ব্যবহারিক ভাষার কমপক্ষে পূর্ণসংখ্যার এবং পৃথক ধরণের হিসাবে ভাসমান হওয়া উচিত - এগুলির জন্য খুব আলাদা অপারেশন।


আপনি যে "জটিল সংখ্যা" উল্লেখ করেছেন তার সাথে আমি পরিচিত নই। আপনি আরও ব্যাখ্যা করতে পারেন?
cpmjr123


জটিল সংখ্যার বিষয়ে আমি + দ্বি দ্বি আকারে অবহিত। কম্পিউটার কীভাবে জটিল নম্বর সংরক্ষণ করে সে সম্পর্কে আমি আরও তথ্যের জন্য জিজ্ঞাসা করছিলাম। আমার জানা মতে, এমন কোনও প্রাথমিক তথ্য প্রকার নেই যা এটি সমর্থন করে।
cpmjr123

জটিল সংখ্যাগুলি সাধারণত দুটি ভাসমান পয়েন্টের মান হিসাবে সংরক্ষণ করা হয়, যথা তাদের a(আসল অংশ) এবং b(কাল্পনিক অংশ)। সিপিইউ সাধারণত জটিল সংখ্যায় ক্রিয়াকলাপের জন্য নেটিভ সমর্থন বাস্তবায়ন করে না, যদিও সিপিইউ মানগুলির জোড়গুলির উপর ক্রিয়াকলাপের জন্য গতিবৃদ্ধি-যুক্ত নির্দেশগুলি কার্যকর করতে পারে, যেমন (a b + c d) এবং (a b-c d)।
রাওয়ং

1
অধিকন্তু, অনেক ভাষায় কিছু প্রকারের রয়েছে যার আচরণটি মোড়কযুক্ত বীজগণিত রিংয়ের মতো মূলত সংজ্ঞায়িত হয় (উদাহরণস্বরূপ, যদি কোনও প্রকারের ভেরিয়েবল uint16_t65535 ধরে থাকে তবে এটি বৃদ্ধি করে এটি 0 ধরে রাখবে)। আদর্শভাবে, বীজগণিতের রিংগুলি এবং সংখ্যার উপস্থাপনের জন্য ভাষাগুলিতে পরিষ্কার-আলাদা পৃথক প্রকারের উপস্থিতি থাকতে হবে ( যে সংখ্যাগুলি মোড়ের প্রত্যাশিত জিনিসগুলিতে সহজেই ক্রিয়াকলাপ সম্পাদনের অনুমতি দেয়, এমন সংখ্যাকে যে ওভারফ্লো আটকা পড়ে যায় )।
সুপারক্যাট

-1

ভাসমান-পয়েন্টের ধরণগুলি পূর্ণসংখ্যার ধরণের থেকে সম্পূর্ণ পৃথক আচরণ করে এবং এ ছাড়াও, আমি সংখ্যার প্রতি আকারের ক্ষেত্রে কেন গুরুত্বপূর্ণ তা আরও একটি চরম উদাহরণ দিতে চাই।

কল্পনা করুন আপনি একটি (দীর্ঘ) অ্যারে বাছাই করতে চান। সি হিসাবে উদাহরণস্বরূপ:

int numbers[100000000];

সুতরাং এখানে আমাদের 100 মিলিয়ন সংখ্যা আছে।

যদি প্রতিটি সংখ্যা কেবল একটি বাইট দীর্ঘ হয় (সুতরাং unsigned charপরিবর্তে ব্যবহার করে int), তবে এটির জন্য 100 মিলিয়ন বাইট স্থানের প্রয়োজন।

আপনি যদি ব্যবহার করেন double, তবে এটি সাধারণত প্রতি সংখ্যা 8 বাইট হয়, তাই 800 মিলিয়ন বাইট স্পেস।

সুতরাং প্রতিবার আপনি প্রচুর অবজেক্ট (এই উদাহরণের সংখ্যা) দিয়ে পরিচালনা করেন, প্রতি বস্তু আকার (এই উদাহরণে সংখ্যার আকার) সত্যই গুরুত্বপূর্ণ।

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