বিশাল পার্থক্য.
নামটি থেকে বোঝা যায়, double
একটিতে [1] এর যথার্থতা 2x রয়েছে । সাধারণভাবে 15 এর দশমিক অঙ্কের নির্ভুলতা রয়েছে, যখন 7 রয়েছে।float
double
float
এখানে সংখ্যার সংখ্যা কীভাবে গণনা করা হয় তা এখানে:
double
52 ম্যান্টিসা বিট + 1 লুকানো বিট রয়েছে: লগ (2 53 ) ÷ লগ (10) = 15.95 সংখ্যা
float
23 ম্যান্টিসা বিট রয়েছে + 1 লুকানো বিট: লগ (2 24 ) ÷ লগ (10) = 7.22 সংখ্যা
এই যথাযথ ক্ষতিটি যখন বার বার গণনা করা হয় তখন বৃহত্তর কাটা ত্রুটি জমা হতে পারে
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g\n", b); // prints 9.000023
যখন
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g\n", b); // prints 8.99999999999996
এছাড়াও, ভাসনের সর্বাধিক মান প্রায় 3e38
, তবে দ্বিগুণ প্রায় 1.7e308
, তাই ব্যবহার করে float
"অনন্ত" (যেমন একটি বিশেষ ভাসমান-বিন্দু সংখ্যা) হিট করতে পারে সাধারণ কোনও কিছুর চেয়ে খুব সহজে double
, যেমন 60০ এর ফ্যাকটোরিয়াল গণনা করা।
পরীক্ষার সময়, সম্ভবত কয়েকটি পরীক্ষার ক্ষেত্রে এই বিশাল সংখ্যা রয়েছে, যার ফলে আপনি যদি ফ্লোটগুলি ব্যবহার করেন তবে আপনার প্রোগ্রামগুলি ব্যর্থ হতে পারে।
অবশ্যই, কখনও কখনও, এমনকি double
যথেষ্ট সঠিক হয় না, তাই আমাদের মাঝে মাঝে long double
[1] থাকে (উপরের উদাহরণটি ম্যাকের উপরে 9.00000000000000006666 দেয়) তবে সমস্ত ভাসমান পয়েন্ট ধরণের ক্ষেত্রে গোল-বন্ধ ত্রুটিতে ভুগছে , সুতরাং যদি নির্ভুলতা খুব গুরুত্বপূর্ণ হয় (যেমন অর্থ প্রক্রিয়াজাতকরণ) আপনার ব্যবহার করা উচিত int
বা একটি ভগ্নাংশ বর্গ।
+=
ত্রুটিগুলি দ্রুত জমে যাওয়ায় প্রচুর ভাসমান পয়েন্ট সংখ্যা যোগ করতে ব্যবহার করবেন না । আপনি যদি পাইথন ব্যবহার করেন তবে ব্যবহার করুন fsum
। অন্যথায়, কাহান সংক্ষেপণ অ্যালগরিদম বাস্তবায়নের চেষ্টা করুন ।
[1]: দ্য সি এবং সি ++ মান প্রতিনিধিত্ব নির্দিষ্ট না float
, double
এবং long double
। এটি সম্ভব যে তিনটিইই আইইইই ডাবল-স্পষ্টতা হিসাবে প্রয়োগ করা হয়েছে। তবুও, বেশিরভাগ আর্কিটেকচারের জন্য (জিসিসি, এমএসভিসি; x86, x64, এআরএম)float
হয় প্রকৃতপক্ষে একটি আইইইই একক স্পষ্টতা ফ্লোটিং পয়েন্ট নম্বর (binary32), এবং double
হয় একটি আইইইই ডাবল স্পষ্টতা ফ্লোটিং পয়েন্ট নম্বর (binary64)।