আমার কি ডাবল বা ভাসমান ব্যবহার করা উচিত?


90

সি ++ এ অন্যটির পরিবর্তে একটি ব্যবহার করার সুবিধা এবং অসুবিধাগুলি কী?


কেউ কি ফ্লোটের অ্যারে এবং ডাবলসের অ্যারে তৈরি করে দেখেছেন যে ফ্লোটে সদস্যদের মধ্যে 4 বাইট এবং ডাবলসের সদস্যদের মধ্যে 8 বাইট রয়েছে কিনা? এটি সম্ভবত সম্ভব যে কোনও 64 বিট সংকলক / কম্পিউটার এখনও ততটুকু প্রয়োজন না সত্ত্বেও ফ্লোটের জন্য সদস্য হিসাবে 8 বাইট সংরক্ষণ করতে পারে।
ব্যবহারকারী 3015682

উত্তর:


104

আপনি যদি সত্যিকারের উত্তরটি জানতে চান, আপনার প্রতিটি কম্পিউটার বিজ্ঞানী ফ্লোটিং-পয়েন্ট অ্যারিমেটিক সম্পর্কে যা জানা উচিত তা পড়া উচিত ।

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

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


10
হ্যাঁ. আধুনিক সিপিইউগুলি মেমরির বৃহত এবং বৃহত্তর অংশগুলি সমান্তরাল সংখ্যাসূচক প্রক্রিয়াকরণ ইউনিট এবং পাইপলাইনযুক্ত আর্কিটেকচারগুলির পূর্বনির্ধারণের সাথে গতির সমস্যাটি আসলেই কোনও সমস্যা নয়। আপনি যদি প্রচুর সংখ্যক সংখ্যক সাথে লেনদেন করেন তবে সম্ভবত 4-বাইট ফ্লোট এবং 8-বাইট ডাবলের মধ্যে আকারের পার্থক্য মেমরির পদক্ষেপে একটি পার্থক্য আনতে পারে
লাভিনিও

4
ওয়েল এসএসই (বা যে কোনও ভার্টর ফ্লোটিং পয়েন্ট ইউনিট) দ্বিগুণ নির্ভুলতার তুলনায় একক নির্ভুলতায় দ্বিগুণ ফ্লপের সংখ্যা প্রক্রিয়া করতে সক্ষম হবে। আপনি যদি মাত্র x87 (বা কোনও স্কেলার) ভাসমান পয়েন্ট করছেন তবে সম্ভবত এটি কোনও ব্যাপার নয়।
গ্রেগ রজার্স 14

4
@ গ্রেগ রজার্স: সংকলকগণ এই মুহুর্তে তেমন স্মার্ট নয়। আপনি কাঁচা সমাবেশ না লিখলে এর বড় আকার আলাদা হয় না। এবং হ্যাঁ, সংকলকটি বিকশিত হওয়ার সাথে সাথে এটি পরিবর্তন হতে পারে।
জে -16 এসডিআইজেড

একটি অতিরিক্ত নোট: যদি আপনার কাছে তথ্যটি কেমন লাগে (আপনার লিঙ্কগুলিতে সমস্ত গণিতে কোনও ধারণা নেই) তবে আপনার ব্যবহার সম্পর্কে অবিচ্ছিন্নভাবে ধারণা নেই তবে doubleএটি বেশিরভাগ ক্ষেত্রেই নিরাপদ।
জে -16 এসডিজেড

@ জোকুন, ভাসমান পয়েন্ট এবং সম্পূর্ণ নির্ভুলতা / সংখ্যাগত স্থায়িত্ব সমস্যার ক্ষেত্রের মধ্যে সহজ কিছুই নেই।
ভোনব্র্যান্ড

45

অন্যথায় আপনার কিছু নির্দিষ্ট কারণ না থাকলে ডাবল ব্যবহার করুন।

সম্ভবত আশ্চর্যের বিষয়, এটি দ্বিগুণ এবং ভাসমান নয় এটি সি (এবং সি ++) এর "স্বাভাবিক" ভাসমান-পয়েন্ট টাইপ। পাপ এবং লগ হিসাবে স্ট্যান্ডার্ড গণিত ফাংশন আর্গুমেন্ট হিসাবে ডাবল লাগে, এবং ফিরে ডাবল। একটি সাধারণ ভাসমান-পয়েন্ট আক্ষরিক, যখন আপনি আপনার প্রোগ্রামে 3.14 লিখবেন , টাইপটি দ্বিগুণ। ভাসা নয়।

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


26

এই প্রশ্নের উত্তর দেওয়া অসম্ভব যেহেতু প্রশ্নের কোনও প্রসঙ্গ নেই। এখানে কিছু জিনিস যা পছন্দকে প্রভাবিত করতে পারে:

  1. ফ্লোটস, ডাবলস এবং লম্বা ডাবলসের সংকলক বাস্তবায়ন। সি ++ স্ট্যান্ডার্ড বলছে:

    তিনটি ভাসমান পয়েন্টের ধরণ রয়েছে: ভাসা, ডাবল এবং দীর্ঘ ডাবল। টাইপ ডাবলটি ভাসমানের মতো কমপক্ষে যথাযথতা সরবরাহ করে এবং টাইপ দীর্ঘ ডাবল কমপক্ষে দ্বিগুণ হিসাবে যথার্থতা সরবরাহ করে।

    সুতরাং, তিনটিই মেমরির ক্ষেত্রে একই আকার হতে পারে।

  2. একটি এফপিইউ উপস্থিতি। সমস্ত সিপিইউতে এফপিইউ থাকে না এবং কখনও কখনও ভাসমান পয়েন্টের ধরণগুলি অনুকরণ করা হয় এবং কখনও কখনও ভাসমান পয়েন্টের ধরণগুলি কেবল সমর্থন করে না।

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

  4. স্মৃতি ব্যান্ডউইথ. যদি কোনও দ্বৈত ভাসমানের চেয়ে বেশি স্টোরেজ প্রয়োজন, তবে ডেটা পড়তে বেশি সময় লাগবে। এটাই নির্বোধ উত্তর। একটি আধুনিক আইএ 32-তে, এটি কোথা থেকে ডেটা আসছে তা নির্ভর করে। যদি এটি এল 1 ক্যাশে থাকে তবে ডেটা একক ক্যাশে লাইন থেকে আসে তবে লোডটি নগন্য provided যদি এটি একাধিক ক্যাশে লাইন বিস্তৃত হয় তবে একটি ছোট ওভারহেড থাকবে। যদি এটি এল 2 থেকে হয় তবে এটি কিছুটা সময় নেয়, যদি এটি র‍্যামে থাকে তবে এটি আরও দীর্ঘ এবং অবশেষে, এটি যদি ডিস্কে থাকে তবে এটি একটি বিশাল সময়। সুতরাং যেভাবে ডেটা ব্যবহার করা হচ্ছে তার চেয়ে ভাসা বা ডাবল পছন্দ কম গুরুত্বপূর্ণ। আপনি যদি প্রচুর অনুক্রমিক ডেটাতে একটি ছোট গণনা করতে চান, তবে একটি ছোট ডেটা টাইপই ভাল। একটি ছোট ডেটা সেটটিতে প্রচুর গণনা করা আপনাকে কোনও উল্লেখযোগ্য প্রভাবের সাথে বড় ধরনের ডেটা ব্যবহার করতে দেয়। আপনি যদি' খুব এলোমেলোভাবে ডেটা অ্যাক্সেস করে, তারপরে ডাটা আকারের পছন্দটি গুরুত্বহীন - পৃষ্ঠা / ক্যাশে লাইনে ডেটা লোড হয়। এমনকি আপনি যদি কেবল র‍্যাম থেকে বাইট চান, আপনি 32 বাইট স্থানান্তর করতে পারেন (এটি সিস্টেমের আর্কিটেকচারের উপর নির্ভরশীল)। এই সর্বোপরি, সিপিইউ / এফপিইউ সুপার-স্কেলার (ওরফে পাইপলাইনযুক্ত) হতে পারে। সুতরাং, যদিও লোডটি বেশ কয়েকটি চক্র গ্রহণ করতে পারে, সিপিইউ / এফপিইউ অন্য কিছু করতে ব্যস্ত হতে পারে (উদাহরণস্বরূপ একটি গুণ) যা লোডের সময়টিকে একটি ডিগ্রীতে লুকিয়ে রাখে।

  5. মান ভাসমান পয়েন্টের মানগুলির জন্য কোনও নির্দিষ্ট বিন্যাস প্রয়োগ করে না।

আপনার যদি কোনও স্পেসিফিকেশন থাকে তবে তা আপনাকে সর্বোত্তম পছন্দে পরিচালিত করবে। অন্যথায়, এটি কী ব্যবহার করবেন তা অনুভব করে।


16

ডাবল আরও সুনির্দিষ্ট তবে 8 বাইটে কোড করা হয়। ভাসমানটি মাত্র 4 বাইট, তাই কম ঘর এবং কম নির্ভুলতা।

আপনার অ্যাপ্লিকেশনটিতে দ্বিগুণ এবং ভেসে উঠলে আপনার খুব যত্নবান হওয়া উচিত। অতীতে আমার একটি বাগ ছিল had কোডের একটি অংশ ফ্লোট ব্যবহার করছিল যখন বাকী কোডটি ডাবল ব্যবহার করছিল। ডাবলকে ফ্লোটে অনুলিপি করুন এবং তারপরে ফ্লোটে ডাবল অনুলিপি করার ফলে নির্ভুল ত্রুটি হতে পারে যা বড় প্রভাব ফেলতে পারে। আমার ক্ষেত্রে এটি একটি রাসায়নিক কারখানা ছিল ... আশা করি এর নাটকীয় পরিণতি ঘটেনি :)

আমি মনে করি যে এই ধরণের বাগের কারণে কয়েক বছর আগে আরিয়েন 6 রকেটটি বিস্ফোরিত হয়েছিল !!!

ভেরিয়েবলের জন্য কী প্রকারটি ব্যবহার করা হবে সে সম্পর্কে সাবধানে চিন্তা করুন


4
নোট করুন যে ভাসমান / ডাবল 4/8 বাইট এমনকি গ্যারান্টিযুক্ত নয়, এটি প্ল্যাটফর্মের উপর নির্ভর করবে। এটি এমনকি একই ধরণের হতে পারে ...
স্ল্যাসকে

4
Ariane তে 5 কোড একটি 16 বিট স্বাক্ষর পূর্ণসংখ্যা মধ্যে একটি 64 বিট ফ্লোটিং পয়েন্ট, যার মানকে 32.767 তার চেয়ে অনেক বেশী ছিল, রূপান্তর করার চেষ্টা করেছেন। এটি একটি ওভারফ্লো ব্যতিক্রম উত্পন্ন করেছে যার ফলে রকেটটি তার স্ব-ধ্বংসাত্মক ক্রম শুরু করেছিল। প্রশ্নযুক্ত কোডটি হ'ল এমন একটি কোড যা একটি পুরানো, ছোট রকেট থেকে পুনরায় ব্যবহৃত হয়েছিল।
সেএমডব্লিউটি

5

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


4

এটি সংকলক কীভাবে ডাবল প্রয়োগ করে তার উপর নির্ভর করে। ডাবল এবং ভাসমান একই ধরণের হওয়ার জন্য এটি বৈধ (এবং এটি কিছু সিস্টেমে রয়েছে)।

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

আরও বেশ কয়েকটি ব্যক্তি পারফরম্যান্স বিচ্ছিন্নতার কথা উল্লেখ করেছেন। আমার বিবেচনার তালিকায় এটি হ'ল শেষ। সঠিকতা আপনার # 1 বিবেচনা হওয়া উচিত।


3

ব্যবহারের যেটা স্পষ্টতা উপযুক্ত ফলাফল অর্জন প্রয়োজন বোধ করা হয় । তারপরে যদি আপনি দেখতে পান যে আপনার কোডটি আপনার পছন্দ মতো কাজ করছে না (আপনি প্রোফাইলিংটি সঠিকভাবে ব্যবহার করেছেন?) একবার দেখুন:


2

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



1

এটি সিপিইউর উপর অত্যন্ত নির্ভর করে যে সর্বাধিক সুস্পষ্ট ট্রেড অফগুলি যথার্থতা এবং মেমরির মধ্যে রয়েছে। RAM এর GBS সঙ্গে, মেমরি, অনেক সময় একটি সমস্যা নয় তাই এটি ব্যবহার সাধারণত ভালো doubleগুলি।

পারফরম্যান্স হিসাবে, এটি সিপিইউর উপর নির্ভর করে। floats double32 টি বিট মেশিনে সাধারণত এর চেয়ে ভাল পারফরম্যান্স পাবে । Bit৪ বিট এ, doubleকখনও কখনও দ্রুত হয়, কারণ এটি (সাধারণত) স্থানীয় আকার native তবুও, আপনার ডেটা ধরণের পছন্দের চেয়ে কী বেশি গুরুত্বপূর্ণ তা হ'ল আপনি আপনার প্রসেসরের সিমড নির্দেশনার সুবিধা নিতে পারবেন কিনা।


0

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


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