সি ++ এ অন্যটির পরিবর্তে একটি ব্যবহার করার সুবিধা এবং অসুবিধাগুলি কী?
সি ++ এ অন্যটির পরিবর্তে একটি ব্যবহার করার সুবিধা এবং অসুবিধাগুলি কী?
উত্তর:
আপনি যদি সত্যিকারের উত্তরটি জানতে চান, আপনার প্রতিটি কম্পিউটার বিজ্ঞানী ফ্লোটিং-পয়েন্ট অ্যারিমেটিক সম্পর্কে যা জানা উচিত তা পড়া উচিত ।
সংক্ষেপে, যদিও এটির উপস্থাপনে উচ্চতর নির্ভুলতারdouble
জন্য অনুমতি দেয় তবে নির্দিষ্ট গণনার জন্য এটি বৃহত্তর ত্রুটি সৃষ্টি করতে পারে । "ডান" পছন্দটি: আপনার প্রয়োজন হিসাবে যথাযথতা ব্যবহার করুন তবে বেশি নয় এবং সঠিক অ্যালগরিদম চয়ন করুন ।
অনেক সংকলক "নন-স্ট্রাইক" মোডে যেভাবেই প্রসারিত ফ্লোটিং পয়েন্ট গণিত করেন (যেমন হার্ডওয়ারে উপলব্ধ বিস্তৃত ভাসমান পয়েন্ট টাইপ ব্যবহার করুন, যেমন 80-বিট এবং 128-বিট ভাসমান), এটিও বিবেচনায় নেওয়া উচিত। অনুশীলনে, আপনি গতিতে খুব কমই পার্থক্য দেখতে পাচ্ছেন - এগুলি যে কোনওভাবেই হার্ডওয়্যারের স্থানীয়।
double
এটি বেশিরভাগ ক্ষেত্রেই নিরাপদ।
অন্যথায় আপনার কিছু নির্দিষ্ট কারণ না থাকলে ডাবল ব্যবহার করুন।
সম্ভবত আশ্চর্যের বিষয়, এটি দ্বিগুণ এবং ভাসমান নয় এটি সি (এবং সি ++) এর "স্বাভাবিক" ভাসমান-পয়েন্ট টাইপ। পাপ এবং লগ হিসাবে স্ট্যান্ডার্ড গণিত ফাংশন আর্গুমেন্ট হিসাবে ডাবল লাগে, এবং ফিরে ডাবল। একটি সাধারণ ভাসমান-পয়েন্ট আক্ষরিক, যখন আপনি আপনার প্রোগ্রামে 3.14 লিখবেন , টাইপটি দ্বিগুণ। ভাসা নয়।
সাধারণ আধুনিক কম্পিউটারগুলিতে, ডাবলগুলি তত দ্রুত বা ততোধিক দ্রুততর হতে পারে, তাই পারফরম্যান্স সাধারণত বড় গণনার জন্যও বিবেচনা করার মতো বিষয় নয়। (এবং সেগুলি বড় গণনা হতে হবে , বা পারফরম্যান্স এমনকি আপনার মনে প্রবেশ করা উচিত নয়। আমার নতুন i7 ডেস্কটপ কম্পিউটার এক সেকেন্ডে ছয় বিলিয়ন ডাবল গুণ করতে পারে।)
এই প্রশ্নের উত্তর দেওয়া অসম্ভব যেহেতু প্রশ্নের কোনও প্রসঙ্গ নেই। এখানে কিছু জিনিস যা পছন্দকে প্রভাবিত করতে পারে:
ফ্লোটস, ডাবলস এবং লম্বা ডাবলসের সংকলক বাস্তবায়ন। সি ++ স্ট্যান্ডার্ড বলছে:
তিনটি ভাসমান পয়েন্টের ধরণ রয়েছে: ভাসা, ডাবল এবং দীর্ঘ ডাবল। টাইপ ডাবলটি ভাসমানের মতো কমপক্ষে যথাযথতা সরবরাহ করে এবং টাইপ দীর্ঘ ডাবল কমপক্ষে দ্বিগুণ হিসাবে যথার্থতা সরবরাহ করে।
সুতরাং, তিনটিই মেমরির ক্ষেত্রে একই আকার হতে পারে।
একটি এফপিইউ উপস্থিতি। সমস্ত সিপিইউতে এফপিইউ থাকে না এবং কখনও কখনও ভাসমান পয়েন্টের ধরণগুলি অনুকরণ করা হয় এবং কখনও কখনও ভাসমান পয়েন্টের ধরণগুলি কেবল সমর্থন করে না।
এফপিইউ আর্কিটেকচার। আইএ 32 এর এফপিইউ অভ্যন্তরীণভাবে 80 বিট - 32 বিট এবং 64 বিট ফ্লোটগুলি লোডের সময় 80 বিটে প্রসারিত করা হয় এবং স্টোরটিতে হ্রাস করা হয়। এখানে সিমড রয়েছে যা সমান্তরালে চারটি 32 বিবিট ফ্লোট বা দুটি 64 বিট ফ্লোট করতে পারে। সিমড ব্যবহার স্ট্যান্ডার্ডে সংজ্ঞায়িত হয় না তাই এটির জন্য এমন একটি সংকলক প্রয়োজন যা সিমড ব্যবহার করা যায় কিনা তা নির্ধারণ করতে আরও জটিল বিশ্লেষণ করে বা বিশেষ ফাংশন (গ্রন্থাগার বা অন্তর্নিবেশ) ব্যবহারের প্রয়োজন হয়। 80 বিট অভ্যন্তরীণ বিন্যাসের আপলোডটি হ'ল র্যামে ডেটা কতবার সংরক্ষণ করা হয় তার উপর নির্ভর করে আপনি কিছুটা পৃথক ফলাফল পেতে পারেন (সুতরাং, নির্ভুলতা হারাতে)। এই কারণে, সংকলকগণ বিশেষত ভাল ভাসমান পয়েন্ট কোডটি অনুকূলিত করে না।
স্মৃতি ব্যান্ডউইথ. যদি কোনও দ্বৈত ভাসমানের চেয়ে বেশি স্টোরেজ প্রয়োজন, তবে ডেটা পড়তে বেশি সময় লাগবে। এটাই নির্বোধ উত্তর। একটি আধুনিক আইএ 32-তে, এটি কোথা থেকে ডেটা আসছে তা নির্ভর করে। যদি এটি এল 1 ক্যাশে থাকে তবে ডেটা একক ক্যাশে লাইন থেকে আসে তবে লোডটি নগন্য provided যদি এটি একাধিক ক্যাশে লাইন বিস্তৃত হয় তবে একটি ছোট ওভারহেড থাকবে। যদি এটি এল 2 থেকে হয় তবে এটি কিছুটা সময় নেয়, যদি এটি র্যামে থাকে তবে এটি আরও দীর্ঘ এবং অবশেষে, এটি যদি ডিস্কে থাকে তবে এটি একটি বিশাল সময়। সুতরাং যেভাবে ডেটা ব্যবহার করা হচ্ছে তার চেয়ে ভাসা বা ডাবল পছন্দ কম গুরুত্বপূর্ণ। আপনি যদি প্রচুর অনুক্রমিক ডেটাতে একটি ছোট গণনা করতে চান, তবে একটি ছোট ডেটা টাইপই ভাল। একটি ছোট ডেটা সেটটিতে প্রচুর গণনা করা আপনাকে কোনও উল্লেখযোগ্য প্রভাবের সাথে বড় ধরনের ডেটা ব্যবহার করতে দেয়। আপনি যদি' খুব এলোমেলোভাবে ডেটা অ্যাক্সেস করে, তারপরে ডাটা আকারের পছন্দটি গুরুত্বহীন - পৃষ্ঠা / ক্যাশে লাইনে ডেটা লোড হয়। এমনকি আপনি যদি কেবল র্যাম থেকে বাইট চান, আপনি 32 বাইট স্থানান্তর করতে পারেন (এটি সিস্টেমের আর্কিটেকচারের উপর নির্ভরশীল)। এই সর্বোপরি, সিপিইউ / এফপিইউ সুপার-স্কেলার (ওরফে পাইপলাইনযুক্ত) হতে পারে। সুতরাং, যদিও লোডটি বেশ কয়েকটি চক্র গ্রহণ করতে পারে, সিপিইউ / এফপিইউ অন্য কিছু করতে ব্যস্ত হতে পারে (উদাহরণস্বরূপ একটি গুণ) যা লোডের সময়টিকে একটি ডিগ্রীতে লুকিয়ে রাখে।
মান ভাসমান পয়েন্টের মানগুলির জন্য কোনও নির্দিষ্ট বিন্যাস প্রয়োগ করে না।
আপনার যদি কোনও স্পেসিফিকেশন থাকে তবে তা আপনাকে সর্বোত্তম পছন্দে পরিচালিত করবে। অন্যথায়, এটি কী ব্যবহার করবেন তা অনুভব করে।
ডাবল আরও সুনির্দিষ্ট তবে 8 বাইটে কোড করা হয়। ভাসমানটি মাত্র 4 বাইট, তাই কম ঘর এবং কম নির্ভুলতা।
আপনার অ্যাপ্লিকেশনটিতে দ্বিগুণ এবং ভেসে উঠলে আপনার খুব যত্নবান হওয়া উচিত। অতীতে আমার একটি বাগ ছিল had কোডের একটি অংশ ফ্লোট ব্যবহার করছিল যখন বাকী কোডটি ডাবল ব্যবহার করছিল। ডাবলকে ফ্লোটে অনুলিপি করুন এবং তারপরে ফ্লোটে ডাবল অনুলিপি করার ফলে নির্ভুল ত্রুটি হতে পারে যা বড় প্রভাব ফেলতে পারে। আমার ক্ষেত্রে এটি একটি রাসায়নিক কারখানা ছিল ... আশা করি এর নাটকীয় পরিণতি ঘটেনি :)
আমি মনে করি যে এই ধরণের বাগের কারণে কয়েক বছর আগে আরিয়েন 6 রকেটটি বিস্ফোরিত হয়েছিল !!!
ভেরিয়েবলের জন্য কী প্রকারটি ব্যবহার করা হবে সে সম্পর্কে সাবধানে চিন্তা করুন
এটি সংকলক কীভাবে ডাবল প্রয়োগ করে তার উপর নির্ভর করে। ডাবল এবং ভাসমান একই ধরণের হওয়ার জন্য এটি বৈধ (এবং এটি কিছু সিস্টেমে রয়েছে)।
বলা হচ্ছে, যদি তারা সত্যই আলাদা হয় তবে মূল বিষয়টি যথার্থতা। আকারের পার্থক্যের কারণে একটি ডাবলটির অনেক বেশি যথার্থতা থাকে। আপনি যে নম্বরগুলি ব্যবহার করছেন তা যদি সাধারণত একটি ফ্লোটের মানকে ছাড়িয়ে যায় তবে ডাবলটি ব্যবহার করুন।
আরও বেশ কয়েকটি ব্যক্তি পারফরম্যান্স বিচ্ছিন্নতার কথা উল্লেখ করেছেন। আমার বিবেচনার তালিকায় এটি হ'ল শেষ। সঠিকতা আপনার # 1 বিবেচনা হওয়া উচিত।
ব্যবহারের যেটা স্পষ্টতা উপযুক্ত ফলাফল অর্জন প্রয়োজন বোধ করা হয় । তারপরে যদি আপনি দেখতে পান যে আপনার কোডটি আপনার পছন্দ মতো কাজ করছে না (আপনি প্রোফাইলিংটি সঠিকভাবে ব্যবহার করেছেন?) একবার দেখুন:
আমি মনে করি পার্থক্য নির্বিশেষে (যা সবাই দেখায়, ভাসমানেরা কম জায়গা নেয় এবং সাধারণভাবে দ্রুত হয়) ... কেউ কি কখনও দ্বিগুণ ব্যবহার করে পারফরম্যান্সের সমস্যায় ভুগছেন? আমি বলি দ্বিগুণ ব্যবহার করুন ... এবং যদি আপনি পরে সিদ্ধান্ত নেন "বাহ, এটি সত্যিই ধীর" ... আপনার পারফরম্যান্সের বাধা খুঁজে নিন (যা সম্ভবত আপনি দ্বিগুণ ব্যবহার করেছেন)। তবুও, যদি এটি এখনও আপনার পক্ষে খুব ধীর হয় তবে দেখুন আপনি কোথায় কিছু নির্ভুলতা দিতে পারেন এবং ভাসা ব্যবহার করতে পারেন।
ভাসা এবং ডাবল মধ্যে প্রধান পার্থক্য যথার্থতা। উইকিপিডিয়ায় একক নির্ভুলতা (ভাসমান) এবং ডাবল নির্ভুলতা সম্পর্কে আরও তথ্য রয়েছে ।
এটি সিপিইউর উপর অত্যন্ত নির্ভর করে যে সর্বাধিক সুস্পষ্ট ট্রেড অফগুলি যথার্থতা এবং মেমরির মধ্যে রয়েছে। RAM এর GBS সঙ্গে, মেমরি, অনেক সময় একটি সমস্যা নয় তাই এটি ব্যবহার সাধারণত ভালো double
গুলি।
পারফরম্যান্স হিসাবে, এটি সিপিইউর উপর নির্ভর করে। float
s double
32 টি বিট মেশিনে সাধারণত এর চেয়ে ভাল পারফরম্যান্স পাবে । Bit৪ বিট এ, double
কখনও কখনও দ্রুত হয়, কারণ এটি (সাধারণত) স্থানীয় আকার native তবুও, আপনার ডেটা ধরণের পছন্দের চেয়ে কী বেশি গুরুত্বপূর্ণ তা হ'ল আপনি আপনার প্রসেসরের সিমড নির্দেশনার সুবিধা নিতে পারবেন কিনা।
ডাবল উচ্চতর নির্ভুলতা আছে, যেখানে ভাসমান কম স্মৃতি গ্রহণ করে এবং দ্রুত হয়। সাধারণভাবে আপনার ভাসা ব্যবহার করা উচিত যদি না এমন কোনও মামলা থাকে যেখানে এটি যথাযথভাবে সঠিক না হয়।