ভাসমান পয়েন্ট ধরণের ব্যবহারের সুবিধাগুলি নিয়ে আপনি স্পষ্ট মনে করছেন। আমি সব ক্ষেত্রে দশমিকের জন্য নকশার ঝোঁক রেখেছি এবং দশমিকের ক্রিয়াকলাপ বাধা বা স্লো-ডাউনগুলি ঘটছে কিনা তা জানতে আমাকে একটি প্রোফাইলারের উপর নির্ভর করি। এই ক্ষেত্রে, আমি দ্বিগুণ বা ভাসতে "ডাউন কাস্ট" করব, তবে কেবল এটি অভ্যন্তরীণভাবে করব এবং সাবধানতার সাথে গাণিতিক ক্রিয়াকলাপে উল্লেখযোগ্য অঙ্কের সংখ্যা সীমাবদ্ধ করে নির্ভুলতা ক্ষতি পরিচালনা করার চেষ্টা করব।
সাধারণভাবে, যদি আপনার মানটি ক্ষণস্থায়ী হয় (পুনরায় ব্যবহৃত না হয়) তবে আপনি ভাসমান পয়েন্টের ধরণটি ব্যবহার করা নিরাপদ। ভাসমান পয়েন্টের ধরণের সমস্যাগুলির সাথে আসল সমস্যাটি হ'ল নিম্নলিখিত তিনটি পরিস্থিতি।
- আপনি ভাসমান পয়েন্টের মানগুলিকে একত্রিত করছেন (সেক্ষেত্রে যথাযথ ত্রুটিগুলি যৌগিক)
- আপনি ভাসমান পয়েন্ট মানের উপর ভিত্তি করে মানগুলি তৈরি করেন (উদাহরণস্বরূপ পুনরাবৃত্ত আলগোরিদিম হিসাবে)
- আপনি খুব বিশাল সংখ্যক উল্লেখযোগ্য অঙ্ক সহ গণিত করছেন (উদাহরণস্বরূপ
123456789.1 * .000000000000000987654321
)
সম্পাদনা
সি # দশমিকের রেফারেন্স ডকুমেন্টেশন অনুসারে :
দশমিক শব্দ একটি 128-বিট ডাটা টাইপ উল্লেখ করে। ভাসমান-পয়েন্টের ধরণের তুলনায়, দশমিক ধরণের একটি বৃহত্তর নির্ভুলতা এবং একটি ছোট পরিসীমা থাকে, যা এটি আর্থিক এবং আর্থিক গণনার জন্য উপযুক্ত করে তোলে।
সুতরাং আমার উপরের বক্তব্যটি স্পষ্ট করতে:
আমি সব ক্ষেত্রে দশমিকের জন্য নকশার ঝোঁক রেখেছি এবং দশমিকের ক্রিয়াকলাপ বাধা বা স্লো-ডাউনগুলি ঘটছে কিনা তা জানতে আমাকে একটি প্রোফাইলারের উপর নির্ভর করি।
আমি কেবল কখনও এমন শিল্পগুলিতে কাজ করেছি যেখানে দশমিকগুলি অনুকূল হয়। আপনি যদি ফিজিক্স বা গ্রাফিক্স ইঞ্জিনগুলিতে কাজ করছেন তবে সম্ভবত একটি ভাসমান পয়েন্ট টাইপের (ফ্লোট বা ডাবল) নকশা করা আরও বেশি উপকারী।
দশমিক অসীম সুনির্দিষ্ট নয় (কোনও প্রাথমিক তথ্য প্রকারে অ-ইন্টিগ্রালের জন্য অসীম নির্ভুলতার প্রতিনিধিত্ব করা অসম্ভব) তবে এটি দ্বিগুণের চেয়ে অনেক বেশি নির্ভুল:
- দশমিক = 28-29 উল্লেখযোগ্য সংখ্যা
- ডাবল = 15-16 উল্লেখযোগ্য সংখ্যা
- ভাসা = 7 উল্লেখযোগ্য সংখ্যা
সম্পাদনা 2
কনরাদ রুডলফের মন্তব্যের জবাবে , আইটেম # 1 (উপরে) অবশ্যই সঠিক। অবজ্ঞানের সমষ্টি প্রকৃতপক্ষে যৌগিক হয়। উদাহরণস্বরূপ নীচের কোডটি দেখুন:
private const float THREE_FIFTHS = 3f / 5f;
private const int ONE_MILLION = 1000000;
public static void Main(string[] args)
{
Console.WriteLine("Three Fifths: {0}", THREE_FIFTHS.ToString("F10"));
float asSingle = 0f;
double asDouble = 0d;
decimal asDecimal = 0M;
for (int i = 0; i < ONE_MILLION; i++)
{
asSingle += THREE_FIFTHS;
asDouble += THREE_FIFTHS;
asDecimal += (decimal) THREE_FIFTHS;
}
Console.WriteLine("Six Hundred Thousand: {0:F10}", THREE_FIFTHS * ONE_MILLION);
Console.WriteLine("Single: {0}", asSingle.ToString("F10"));
Console.WriteLine("Double: {0}", asDouble.ToString("F10"));
Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10"));
Console.ReadLine();
}
এটি নিম্নলিখিত ফলাফলগুলি দেয়:
Three Fifths: 0.6000000000
Six Hundred Thousand: 600000.0000000000
Single: 599093.4000000000
Double: 599999.9999886850
Decimal: 600000.0000000000
আপনি দেখতে পাচ্ছেন, যদিও আমরা একই উত্স থেকে ধ্রুবক যোগ করছি, দ্বিগুণের ফলাফল কম সুনির্দিষ্ট (যদিও সম্ভবত সঠিকভাবে গোল হবে), এবং ভাসমানটি এত কম সুনির্দিষ্ট, যেখানে এটি কেবল হ্রাস পেয়েছে been দুটি উল্লেখযোগ্য সংখ্যা।