আপনি কখন ভাসা ব্যবহার করবেন এবং কখন আপনি ডাবল ব্যবহার করবেন


194

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

আপনি কখন ভাসা ব্যবহার করবেন এবং কখন আপনি ডাবল ব্যবহার করবেন? আপনি কি সবসময় দ্বিগুণ ব্যবহার করেন, যখন কেবল স্মৃতির সীমাবদ্ধতা উপস্থিত থাকে আপনি যখন ভাসতে যান? বা নির্ভুলতার প্রয়োজনে ডাবল ব্যবহারের প্রয়োজন না থাকলে আপনি সর্বদা ভাসা ব্যবহার করেন? ভাসমান এবং ডাবল মধ্যে মৌলিক গাণিতিকের গণনা জটিলতা সম্পর্কে কিছু উল্লেখযোগ্য পার্থক্য আছে? ভাসা বা ডাবল ব্যবহারের পক্ষে কি কি? এবং আপনি এমনকি দীর্ঘ ডাবল ব্যবহার করেছেন?


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

3
সম্পর্কিত কি ভাসমান পয়েন্ট রাউন্ডিং ত্রুটির কারণ? । @ কোডসআইওনস আমার উত্তরটিতে আপনার সেই সংকল্পটি তৈরি করতে সহায়তা করার জন্য সংস্থানগুলি সরবরাহ করার পরামর্শ দেয়, কোনও আকারের-ফিট-সব সমাধান নেই।
মার্ক বুথ

খুব ভাল উত্তর পাওয়া গেছে: স্ট্যাক ওভারফ্লো
হারিস

5
"দশমিক" দ্বারা ঠিক কী বোঝাতে চান? আপনার যদি 0.01 এর মতো মানগুলি হুবহু উপস্থাপন করতে হয় (অর্থের জন্য বলুন), তবে (বাইনারি) ভাসমান-পয়েন্ট উত্তর নয়। যদি আপনি কেবল অ-পূর্ণসংখ্যার সংখ্যা বোঝাতে চান তবে ভাসমান-পয়েন্টটি সম্ভবত ঠিক আছে - তবে তারপরে আপনার কী প্রয়োজন তা বর্ণনা করার জন্য "দশমিকগুলি" সেরা শব্দ নয়।
কিথ থম্পসন

1
আপনার সবসময় কোনও পছন্দ হয় না। উদাহরণস্বরূপ, আরডুইনো প্ল্যাটফর্মে, ডাবল এবং ভাসমান উভয়ই ভাসমান সমান। রিয়েল ডাবলগুলি পরিচালনা করতে আপনার একটি অ্যাড-ইন লাইব্রেরি খুঁজে বের করতে হবে।
কিউইরন

উত্তর:


187

ভাসমান-পয়েন্ট ধরণের জন্য ডিফল্ট পছন্দ হওয়া উচিত double। এই টাইপ যে আপনি একটি প্রত্যয় ছাড়া বা (সি) মান ফাংশন যে ফ্লোটিং পয়েন্ট সংখ্যা (উদাঃ কাজ ফ্লোটিং পয়েন্ট লিটারেল সঙ্গে পাবেন exp, sin, ইত্যাদি)।

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

long doubleআপনার চেয়ে আরও পরিসর বা নির্ভুলতার প্রয়োজন doubleহলে এবং এটি যদি আপনার লক্ষ্য প্ল্যাটফর্মে এটি সরবরাহ করে তবে ব্যবহার করা যেতে পারে ।

সংক্ষেপে, floatএবং long doubleবিশেষজ্ঞদের ব্যবহারের doubleজন্য "প্রতিদিন" ব্যবহারের জন্য সংরক্ষণ করা উচিত।


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

4
সংযোজন হিসাবে, অন্য সিস্টেমের সাথে আপনার যদি সামঞ্জস্যতা প্রয়োজন হয় তবে একই ডেটা ধরণের ব্যবহার করা সুবিধাজনক হতে পারে।
zzzzBov

15
আমি কয়েক মিলিয়ন সংখ্যার জন্য ফ্লোট ব্যবহার করব না, রাইট not এছাড়াও, কিছু জিপিইউ ফ্লোটের সাথে আরও ভাল করে, সেই ক্ষেত্রে বিশেষায়িত ক্ষেত্রে ফ্লোট ব্যবহার করুন। অন্যথায়, আপনি যেমন বলেন, ডাবল ব্যবহার করুন।
user949300

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

12
আমি এই উত্তরটি একটি অতিরিক্ত পরামর্শ দিয়ে সমর্থন করি: যখন কেউ আরজিবি মানগুলির সাথে প্রদর্শনের জন্য অপারেটিং হয় তখন এটি ব্যবহার করা গ্রহণযোগ্য float(এবং মাঝে মাঝে অর্ধ-নির্ভুলতা) কারণ মানুষের চোখ, প্রদর্শন বা রঙ সিস্টেমের মধ্যে কোনওটিই নির্ভুলতার অনেকগুলি বিট নেই । এই পরামর্শ ওপেনজিএল ইত্যাদির জন্য প্রযোজ্য। এই অতিরিক্ত পরামর্শটি মেডিকেল চিত্রগুলিতে প্রযোজ্য না, যার আরও কঠোর নির্ভুলতা প্রয়োজন requirements
rwong

42

আধুনিক কম্পিউটারগুলিকে লক্ষ্য করে কোড ডাবল করার পরিবর্তে ভাসমান ব্যবহারের কারণ খুব কমই আছে। অতিরিক্ত নির্ভুলতা গোলাকার ত্রুটিগুলি বা অন্যান্য অনর্থক সমস্যার সৃষ্টি করার সম্ভাবনা হ্রাস করে (তবে তা সরিয়ে দেয় না)।

আমি ভাসা ব্যবহারের কথা ভাবতে পারি তার প্রধান কারণগুলি হ'ল:

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

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


2
"আধুনিক কম্পিউটার" অর্থ ইন্টেল x86 প্রসেসর। প্রাচীনরা ব্যবহৃত কিছু মেশিনগুলি মৌলিক ভাসমান ধরণের সাথে পুরোপুরি যথাযথ নির্ভুলতা সরবরাহ করে। (CDC 6600 60-বিট শব্দ, সাধারণ ফ্লোটিং পয়েন্ট অংশক 48 বিট, এক্সপোনেন্ট 12 বিট ব্যবহৃত দ্যাট অলমোস্ট কি এক্স 86 ডবল স্পষ্টতা জন্য আপনাকে দেয় নাই।।)
জন আর Strohm

@ জন.আর.স্ট্রোহম: সম্মত হয়েছে, তবে সিডিসি 6600 এ সি সংকলকগুলির অস্তিত্ব ছিল না। এটি ছিল
ফোর্টরান

"আধুনিক কম্পিউটারগুলি" বলতে আমি বোঝাতে চাইছি যে কোনও প্রসেসর গত দু'দশকের মধ্যে নির্মিত বা সত্যই, যেহেতু আইইইই ফ্লোটিং পয়েন্ট স্ট্যান্ডার্ডটি ব্যাপকভাবে প্রয়োগ করা হয়েছিল। আমি পুরোপুরি সচেতন যে নন- x86 আর্কিটেকচারের উপস্থিতি রয়েছে এবং আমার উত্তরটি মনে রেখেছিল - আমি জিপিইউ এবং এমবেডেড প্রসেসরের উল্লেখ করেছি, যা সাধারণত x86 নয়।
ব্যবহারকারী 611910

যদিও এটি কেবল সত্য নয়। এসএসই 2 একটি অপারেশনে 4 ফ্লোট বা 2 ডাবলগুলি পরিচালনা করতে পারে, এভিএক্স 8 টি ফ্লোট বা 4 ডাবলগুলি পরিচালনা করতে পারে, এভিএক্স -512 16 টি ফ্লোট বা 8 ডাবলগুলি ম্যানিপুলেট করতে পারে। যে কোনও ধরণের উচ্চ পারফরম্যান্সের কম্পিউটিংয়ের জন্য, ফ্ল্যাট অন ম্যাথকে x86 এর দ্বিগুণে একই ক্রিয়াকলাপের দ্বিগুণ হিসাবে বিবেচনা করা উচিত।
ল্যারি গ্রিটজ

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

10

আপনার doubleসমস্ত গণনা এবং টেম্প ভেরিয়েবলের জন্য ব্যবহার করুন । আপনার floatযখন সংখ্যার একটি অ্যারে বজায় রাখা দরকার তখন ব্যবহার করুন - float[](যদি যথার্থতা যথাযথ হয়) এবং আপনি কয়েক হাজার floatসংখ্যক সংখ্যক নিয়ে কাজ করছেন।

অনেক / বেশিরভাগ গণিতের ক্রিয়াকলাপ বা অপারেটর রূপান্তর / ফেরত দেয় doubleএবং আপনি floatকোনও মধ্যবর্তী পদক্ষেপের জন্য নম্বরগুলি আবার দিতে চান না ।

উদাহরণস্বরূপ আপনার যদি কোনও ফাইল বা কোনও স্ট্রিম থেকে ১০০,০০০ সংখ্যার ইনপুট থাকে এবং সেগুলি সাজানোর দরকার হয় তবে নম্বরগুলি একটিতে রেখে দিন float[]


5

কিছু প্ল্যাটফর্ম (এআরএম কর্টেক্স-এম 2, কর্টেক্স-এম 4 ইত্যাদি) দ্বিগুণ সমর্থন করে না (এটি সর্বদা আপনার প্রসেসরের রেফারেন্স ম্যানুয়ালটিতে পরীক্ষা করা যায় If যদি কোনও সংকলনের সতর্কতা বা ত্রুটি না থাকে, তার মানে এই নয় যে কোডটি সর্বোত্তম। ডাবল অনুকরণ করা যেতে পারে।)। এজন্য আপনাকে ইনট বা ফ্লোটে লেগে থাকতে পারে ।

যদি এটি না হয় তবে আমি ডাবল ব্যবহার করব ।

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

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf


3
এই প্রশ্নের ইতিমধ্যে এক বছর আগে বেশ উত্তম উত্তর দেওয়া হয়েছিল ... তবে যে কোনও ক্ষেত্রে, আমি যে কোনও সময় ডাবল নির্ভুলতা এফপিইউ ত্বরণ সহ প্ল্যাটফর্মে ডাবল ব্যবহার করার সময় বলতে চাইছি, আপনি অন্য যে কোনও জায়গায় এটি ব্যবহার করা উচিত, এমনকি যদি এর অর্থও হয় শুধুমাত্র ভাসমান-পয়েন্ট সহ কোনও এফপিইউর সুবিধা নেওয়ার পরিবর্তে সংকলকটি এটিকে অনুকরণ করতে দিন (নোট করুন যে সমস্ত প্ল্যাটফর্মে এফপিইউর প্রয়োজন হয় না, বাস্তবে একটি কর্টেক্স-এম 4 আর্কিটেকচার তাদেরকে একটি alচ্ছিক বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত করেছে [এম 2 টাইপো ছিল?]) )।
সিলালী অ্যাডোবোর

এই যুক্তিটির মূল কথাটি, যদিও এটি সত্য যে ভাসমান পয়েন্ট পাটিগণিত সম্পর্কে ক্লান্ত হওয়া উচিত, এবং এটি অনেকগুলি "quirks", অবশ্যই ডাবলসের জন্য FPU সমর্থনের উপস্থিতি গ্রহণ না করে বোঝাতে চাইলে কেবল ফ্লোটের পরিবর্তে ডাবল ব্যবহার করা যায়। ফ্লোটগুলি ডাবলসের তুলনায় খুব দ্রুত এবং মেমরি কম নেয় (এফপিইউ বৈশিষ্ট্যগুলি পরিবর্তিত হয়)। ব্যবহারের ভলিউম এই পয়েন্টটিকে অকাল অপটিমাইজেশনে থাকা থেকে বিরত রাখে। যেমন সত্য দ্বিগুণ অনেকগুলি (সম্ভবত এমনকি বেশিরভাগ) অ্যাপ্লিকেশনগুলির জন্য স্পষ্টভাবে ওভারকিল। এই পৃষ্ঠার উপাদানগুলির কি সত্যিকারের 13 দশমিক স্থানে তাদের আপেক্ষিক অবস্থান এবং আকারগুলি গণনা করা দরকার ?
সিলালী অ্যাডোবার

2
অফ সাইট পৃষ্ঠা বা নথির কোনও লিঙ্ক অন্তর্ভুক্ত করার সময়, দয়া করে আপনার উত্তরটিতে নথি থেকে প্রাসঙ্গিক তথ্য বা সংক্ষিপ্তসারটি অনুলিপি করুন। অফ সাইট লিঙ্কগুলির সময়ের সাথে সাথে অদৃশ্য হওয়ার প্রবণতা রয়েছে।
অ্যাডাম জুকারম্যান 0

3

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

বেশিরভাগ আসল ওয়ার্ল্ড স্যাম্পেলাররা 24 বিট ড্যাকের মধ্যে সীমাবদ্ধ। প্রস্তাবিত যে বাস্তব বিশ্ব গণনাতে 32 বিট নির্ভুলতা পর্যাপ্ত হওয়া উচিত যেখানে তাত্পর্যটি যথাযথতার 24 বিট হয়।

2x মেমরির দামে ডাবল নির্ভুলতা আসে। সুতরাং ফ্লোটের ওপরে ডাবলসের ব্যবহার সীমাবদ্ধ করা চলমান অ্যাপ্লিকেশনগুলির মেমরির পদক্ষেপ / ব্যান্ডউইথকে মারাত্মকভাবে কাটাতে পারে।


-3

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


3
এই উত্তরটি প্রশ্নের নতুন কিছু যোগ করে না এবং প্রকৃত ব্যবহারের বিষয়ে কিছু বলতে ব্যর্থ হয়।
মার্টিজন পিটারস

-5

সাধারণত, আমি floatটাইপটি যখন ব্যবহার করি যখন খুব বেশি নির্ভুলতার প্রয়োজন হয় না - উদাহরণস্বরূপ, অর্থের জন্য - যা ভুল, তবে যা আমি ভুলভাবে করতে অভ্যস্ত।

অন্যদিকে, doubleযখন আমার আরও নির্ভুলতার প্রয়োজন হয় তখন আমি ব্যবহার করি, উদাহরণস্বরূপ জটিল গাণিতিক অ্যালগরিদমের জন্য।

সি 99 স্ট্যান্ডার্ড এটি বলে:

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

আমি কখনই সত্যই ব্যবহার করি না long double, তবে আমি সি / সি ++ বেশি ব্যবহার করি না। সাধারণত আমি পাইথনের মতো গতিশীল টাইপযুক্ত ভাষা ব্যবহার করি, যেখানে আপনাকে প্রকারগুলির বিষয়ে যত্ন নিতে হবে না।

ডাবল বনাম ফ্লোট সম্পর্কে আরও তথ্যের জন্য , এসও এ এই প্রশ্নটি দেখুন ।


25
গুরুতর অর্থ গণনার জন্য ভাসমান পয়েন্ট ব্যবহার করা সম্ভবত একটি ভুল।
বার্ট ভ্যান ইনজেন শেহানাউ

17
অর্থের জন্য ভাসা হুবহু ভুল টাইপ। আপনার যথাসম্ভব সর্বোচ্চ নির্ভুলতা ব্যবহার করা দরকার।
ক্রিসএফ

8
@BartvanIngenSchenau অর্থের জন্য ভাসমান বিন্দু সাধারণত ঠিক আছে, বাইনারি ফ্লোটিং বিন্দু নয়। উদাহরণস্বরূপ। নেট এর Decimalএকটি ভাসমান পয়েন্ট টাইপ এবং এটি সাধারণত অর্থের গণনার জন্য একটি ভাল পছন্দ।
কোডসইনচাউস

13
@ ক্রিসফ আপনার অর্থের জন্য আপনার "উচ্চ নির্ভুলতা" লাগবে না, আপনার সঠিক মান দরকার।
শন ম্যাকসোমিংথ

2
@ সানম্যাকসোমথিং - ফেয়ার পয়েন্ট। তবে, ফ্লোটগুলি এখনও ভুল টাইপ এবং বেশিরভাগ ভাষায় ভাসমান পয়েন্টের ধরণের প্রকারের জন্য আপনাকে "সঠিক মানগুলি" পেতে "উচ্চ নির্ভুলতা" প্রয়োজন।
ক্রিসএফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.