নির্ভুলতা না হারিয়ে আইইইই 754 ডাবল টাইপের মধ্যে সংরক্ষণ করা যায় এমন বৃহত্তম "No-floating" পূর্ণসংখ্যাটি কী?
নির্ভুলতা না হারিয়ে আইইইই 754 ডাবল টাইপের মধ্যে সংরক্ষণ করা যায় এমন বৃহত্তম "No-floating" পূর্ণসংখ্যাটি কী?
উত্তর:
নির্ভুলতা হারানো ছাড়াই সবচেয়ে বড় / বৃহত্তম পূর্ণসংখ্যা যা ডাবল হিসাবে সংরক্ষণ করা যেতে পারে এটি দ্বিগুণের বৃহত্তম সম্ভাব্য মানের সমান। এটি, DBL_MAX
বা আনুমানিক 1.8 × 10 308 (যদি আপনার ডাবলটি আইইইই 754 64-বিট ডাবল হয়)। এটি একটি পূর্ণসংখ্যা এটি ঠিক উপস্থাপন করা হয়। আপনি আরো কি করতে চান?
এগিয়ে যান, আমাকে জিজ্ঞাসা করুন বৃহত্তম পূর্ণসংখ্যাটি কী, যেমন এটি এবং সমস্ত ছোট পূর্ণসংখ্যার নির্ভুলতা হারানো ছাড়াই আইইইই 64৪-বিট ডাবলসে সংরক্ষণ করা যেতে পারে। একটি আইইইই 64-বিট ডাবলটিতে ম্যান্টিসার 52 বিট রয়েছে, তাই আমি মনে করি এটি 2 53 :
বা এটি দেখার অন্য কোনও উপায়: একবার পক্ষপাতদুষ্টকে ঘুরিয়ে নিয়ে যাওয়া, এবং চিহ্নটির চিহ্নটিকে প্রশ্নের অপ্রাসঙ্গিক হিসাবে উপেক্ষা করার পরে, দ্বিগুণ দ্বারা সঞ্চিত মান 2 এর পাওয়ার, এবং 52-বিট পূর্ণসংখ্য 2 দিয়ে গুণিত হয় সূচক - 52 । সুতরাং 52২ এর সাথে আপনি সমস্ত মান 2 2 52 থেকে 2 53 - 1 পর্যন্ত সংরক্ষণ করতে পারেন তারপরে 53 টির পরে আপনি পরবর্তী নম্বরটি 2 53 এর পরে 2 53 + 1 × 2 রাখতে পারবেন 52 - 53 । সুতরাং নির্ভুলতা হ্রাস প্রথমে 2 53 + 1 এর সাথে ঘটে ।
9007199254740992 (এটি 9,007,199,254,740,992) কোনও গ্যারান্টি ছাড়াই :)
কার্যক্রম
#include <math.h>
#include <stdio.h>
int main(void) {
double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
while (dbl + 1 != dbl) dbl++;
printf("%.0f\n", dbl - 1);
printf("%.0f\n", dbl);
printf("%.0f\n", dbl + 1);
return 0;
}
ফলাফল
9007199254740991 9007199254740992 9007199254740992
double dbl = 1; while (dbl + 1 != dbl) dbl *= 2; while (dbl == --dbl);
যা একই ফলাফল দেয়
while (dbl == --dbl)
চিরকালের জন্য লুপ করা বা না একেবারে না। :) (এই ক্ষেত্রে, একেবারেই নয়, যেহেতু এটি 2 ^ এন)। আপনাকে নীচের থেকে এটির কাছে যেতে হবে। এটি প্রকৃতপক্ষে প্রত্যাশিত ফলাফলের চেয়েও কম ফলাফল তৈরি করবে (যেহেতু এক চেকটি যখন লুপ হ্রাস dbl)। এবং এটি কার্যকর করার আদেশের উপর নির্ভর করে, যদি বাম পাশের মূল্যায়ন করার আগে বা পরে হ্রাস করা হয় (যা আমি জানি যতক্ষণ অপরিজ্ঞাত)। যদি এটি পূর্ব হয় তবে এটি সর্বদা সত্য এবং চিরতরে লুপ হয়ে যাবে।
while (dbl + 1 != dbl) dbl++;
যে dbl + 1 != dbl
ব্যবহার মূল্যায়ন পারে long double
গণিত - বিবেচনা FLT_EVAL_METHOD == 2
। এটি একটি অসীম লুপে শেষ হতে পারে।
উইকিপিডিয়ায় আইইইই 754 এর লিঙ্কের সাথে একই প্রসঙ্গে বলতে হবে :
একটি সাধারণ কম্পিউটার সিস্টেমে, একটি 'ডাবল নির্ভুলতা' (-৪-বিট) বাইনারি ভাসমান-পয়েন্ট সংখ্যাটির 53 টি বিট (যার মধ্যে একটি অন্তর্ভুক্ত) এর সহগ থাকে, 11 বিটের এক্সপোজন এবং একটি চিহ্ন বিট।
2 ^ 53 মাত্র 9 * 10 ^ 15 এর উপরে।
সবচেয়ে বড় পূর্ণসংখ্যা যা আইইইই 754 ডাবল (bit৪-বিট) তে উপস্থাপিত হতে পারে টাইপটি যে ধরণের প্রতিনিধিত্ব করতে পারে তার বৃহত্তম মানটির সমান, যেহেতু সেই মানটিই একটি পূর্ণসংখ্যা।
এটি এমনভাবে উপস্থাপিত হয় 0x7FEFFFFFFFFFFFFF
যা গঠিত:
0x7FE
(2046 যা পক্ষপাত বিয়োগের পরে 1023 প্রতিনিধিত্ব করে) সর্বাধিক ব্যয়কারী ( 0x7FF
2047 যা একটি NaN
বা অনন্ত নির্দেশ করে )।0xFFFFFFFFFFFFF
যা 52 বিট সমস্ত 1।বাইনারি ভাষায় মানটি অন্তর্নিহিত 1 এবং ম্যান্টিসা থেকে আরও 52 জন অনুসরণ করে, তারপরে ব্যয়কারী থেকে 971 জিরো (1023 - 52 = 971)।
সঠিক দশমিক মান হ'ল:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
এটি প্রায় 1.8 x 10 308 ।
আপনাকে ম্যান্টিসার আকারটি দেখতে হবে। একটি আইইইই 754 64 বিট ভাসমান পয়েন্ট সংখ্যা (যার মধ্যে 52 বিট, প্লাস 1 সূচিত) সঠিকভাবে 2 ^ 53 এর চেয়ে কম বা সমান এর নিখুঁত মান সহ পূর্ণসংখ্যার প্রতিনিধিত্ব করতে পারে।
1.7976931348623157 × 10 ^ 308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
DECIMAL_DIG
এর থেকে <float.h>
কমপক্ষে একটি যুক্তিসঙ্গত অনুমান দেওয়া উচিত। যেহেতু দশমিক সংখ্যা নিয়ে কাজ করে এবং এটি সত্যিই বাইনারিতে সঞ্চিত হয়, আপনি সম্ভবত নির্ভুলতা না হারিয়ে কিছুটা বড় কিছু সঞ্চয় করতে পারেন তবে ঠিক কতটা বলা শক্ত। আমি মনে করি আপনার এটিকে নির্ধারণ করতে সক্ষম হওয়া উচিত FLT_RADIX
এবং DBL_MANT_DIG
তবে আমি নিশ্চিত না যে আমি ফলাফলটি পুরোপুরি বিশ্বাস করব।
double
নির্দিষ্ট আইইইই টাইপের সাথে সরাসরি সম্পর্কিত, তবে এটির প্রয়োজন হয় না, এবং যখন এই উত্তরটি লেখা হয়েছিল তখন প্রশ্নটি কোনও নির্দিষ্ট আইইইই টাইপের উল্লেখ করেনি।