ফ্লোট এবং ডাবলের মধ্যে পার্থক্য - আমি কোনটি ব্যবহার করব?

Anonim

(দ্রষ্টব্য: এই নিবন্ধটি অনুমান করে পাঠকগণ কম্পিউটার বিজ্ঞানের মূল বিষয়গুলি সম্পর্কে জানেন)

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

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

ডাবল বিট ভাসা … চুক্তি কি?

ফ্লোট এবং ডাবলটি হল ডাটা উপস্থাপনা যা ফ্লোটিং পয়েন্টের গাণিতিক অপারেশনগুলির জন্য ব্যবহৃত হয়, গণিত শ্রেণীতে গণনা করা দশমিক সংখ্যাগুলির মত মনে করে, যেমন,

20 123

, 16 23 , 10। 2 , ইত্যাদি, তারা সম্পূর্ণ সংখ্যার নয় (অর্থাৎ, , 5 , 15 ইত্যাদি), এভাবে তাদের বিবেচনা করা প্রয়োজন। বাইনারি মধ্যে ভগ্নাংশ ফলস্বরূপ দশমিক সংখ্যা হিসাবে (i। ই।, 20। 123 , 16। 23 ইত্যাদি।) সহজে একটি স্বাভাবিক বাইনারি বিন্যাস (i। ই। ইন্টিগ্রার) দিয়ে প্রতিনিধিত্ব করা যায় না। ফ্লোট এবং ডাবলের মধ্যে প্রধান পার্থক্য হল যে একমাত্র স্পষ্টতা (32-বিট) ফ্লোটিং পয়েন্ট ডেটা, পরেরটি ডাবল স্পেসিফিকেশন (64-বিট) ফ্লোটিং পয়েন্ট ডেটা টাইপ। ডাবলকে "ডাবল" বলা হয় কারণ এটি মূলত ফ্লোটের একটি ডাবল স্পষ্টতা সংস্করণ। যদি আপনি একটি বিশাল পরিমাণ গণনা করা হয় (সংখ্যা মধ্যে 0 এর হাজার হাজার মনে করেন), তাহলে দালালের মধ্যে ত্রুটিগুলি ছোট হবে এবং আপনি খুব নির্ভুলতা হারাবেন না।

কোডের উদাহরণগুলি ব্যবহার করে বিস্তৃত করা ভাল। নিম্নগামী ফ্ল্যাটের উপর অপারেশন এবং সি ভাষায় প্রদত্ত গণিত ফাংশনগুলির মাধ্যমে দ্বিগুণ:

# ইনক্লাইড

int main () {

float num1 = 1. f / 82;

float num2 = 0;

জন্য (int i = 0; i <738; ++ i)

num2 + = num1;

printf ("%.7g n", num2);

ডবল num3 = 1. 0/82;

ডবল num4 = 0;

জন্য (int i = 0; i <738; ++ i)

num4 + = num3;

printf ("% 15g n", num4);

getchar, ();

}

এটি নিম্নলিখিত ছাপে:

9 000031

8। 99999999999983

এখানে, আপনি দেখতে পারেন যে ফ্লোট এবং ডাবলের নির্ভুলতায় সামান্য পার্থক্য আলাদা আলাদা উত্তর দেয়, যদিও ফ্লোটের চেয়ে ডাবলটি আরও সঠিক বলে মনে হয়।

C:

# অন্তর্ভুক্তি

# অন্তর্ভুক্ত করা

int main () {

float num1 = sqrt (2382719676512365। 1230112312312312) এ sqrt () ফাংশনটির উদাহরণ হচ্ছে);

ডবল সংখ্যা 2 = sqrt (2382719676512365। 1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar, ();

}

এটি নিম্নলিখিত আউটপুট দেয়:

48813108 000000

48813109। 678778

এখানে, আপনি দেখতে পারেন যে ডাবলের উত্তরের একটি ভাল নির্ভুলতা রয়েছে।

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

আধুনিক কম্পিউটারের লক্ষ্যবস্তু কোডের মধ্যে ডাবলের পরিবর্তে ফ্ল্যাট ব্যবহার করা খুব কমই আছে। দ্বিগুণে অতিরিক্ত নির্ভুলতা হ্রাস পায়, কিন্তু সমাপ্তি ঘটায় বা প্রোগ্রামার অন্যান্য অংশে সমস্যার সৃষ্টি করতে পারে এমন অস্থিরতা বা গোলমালের সুযোগের অবসান হয় না। অনেক গণিত ফাংশন বা অপারেটর ডাবলকে রূপান্তরিত করে ফেরত পাঠায়, তাই আপনি ফ্লোটে ফিরে সংখ্যাগুলি ঢোকাতে হবে না, যেটি স্পষ্টতা হারাতে পারে।ফ্লোটিং-পয়েন্ট অ্যারেটিএমটিএর বিশদ বিশ্লেষণের জন্য, আমি আপনাকে এই অসাধারণ নিবন্ধটি পড়ার সুপারিশ করছি (// docs। Oracle com / cd / E19957-01 / 806-3568 / ncg_goldberg। Html)।

সংক্ষিপ্ত বিবরণ

তাই … সংক্ষিপ্তভাবে:

যেখানে আপনি ফ্লোট ব্যবহার করা উচিত সেখানে স্থান:

যদি আপনি এমন হার্ডওয়্যার লক্ষ্য করেন যেখানে একক স্পষ্টতা দ্বিগুণতার চেয়ে দ্রুততর হয়।

আপনার অ্যাপ্লিকেশনটি ভাসমান পয়েন্টের গাণিতিক ব্যবহারে ভারী ব্যবহার করে, যেমন হাজার হাজার সংখ্যা সহ 0 সংখ্যা

  • আপনি খুব কম-স্তরীয় অপ্টিমাইজেশান করছেন। উদাহরণস্বরূপ, আপনি বিশেষ CPU নির্দেশাবলী (i।, SSE, SSE2, AVX, ইত্যাদি) ব্যবহার করছেন যা একটি সময়ে একাধিক সংখ্যা / অ্যারে / ভেক্টরগুলিতে কাজ করে।
  • উপসংহার
এই প্রবন্ধে আমি ফ্লোট এবং ডাবলের মধ্যে পার্থক্য তুলে ধরেছি এবং নির্দিষ্ট কোন স্থানে কোনটি ব্যবহার করা উচিত। অকপটভাবে, বেশিরভাগ ক্ষেত্রে অন্ধভাবে অন্ধকারে ব্যবহার করা ভাল, বিশেষত যদি আপনি আধুনিক কম্পিউটারগুলি লক্ষ্য করেন, তবে ডাবল ফ্লোটিং-পয়েন্ট অ্যারেটিম্যাটিক ব্যবহারের কারণে কম দক্ষতার সম্ভাবনাটি অসম্ভাব্য। যদি আপনার কোন প্রশ্ন থাকে, তাহলে আপনি নীচের মন্তব্য অংশে জিজ্ঞাসা করতে পারেন!