কোন প্রথম পূর্ণসংখ্যাটি কোন আইইইই 754 ভাসাটি হুবহু উপস্থাপনে অক্ষম?


162

স্পষ্টতার জন্য, আমি যদি এমন কোন ভাষা ব্যবহার করি যা আইইই 754 ফ্লোটগুলি কার্যকর করে এবং আমি ঘোষণা করি:

float f0 = 0.f;
float f1 = 1.f;

... এবং তারপরে এগুলি আবার মুদ্রণ করুন, আমি 0.0000 এবং 1.0000 - হুবহু পেয়ে যাব।

তবে আইইইই 754 রিয়েল লাইনের সাথে সমস্ত সংখ্যা উপস্থাপন করতে সক্ষম নয়। শূন্যের কাছাকাছি, 'ফাঁকগুলি' ছোট; আপনি আরও দূরে সরে যাওয়ার সাথে সাথে ফাঁকগুলি আরও বড় হতে থাকে।

সুতরাং, আমার প্রশ্নটি হল: কোনও আইইইই 754 ফ্লোটের জন্য, যা প্রথম (শূন্যের নিকটতম) পূর্ণসংখ্যা যা সঠিকভাবে উপস্থাপন করা যায় না? আমি আপাতত কেবল 32-বিট ভাসমান নিয়েই উদ্বিগ্ন, যদিও আমি যদি কেউ it৪-বিটের উত্তর শুনতে আগ্রহী হয়!

আমি ভেবেছিলাম এটি 2 বিট_ফ_মন্তিসার গণনা করা এবং 1 যোগ করার মতোই সহজ হবে যেখানে বিট_অফ_মন্তিসা হ'ল স্ট্যান্ডার্ডটি কত বিট প্রকাশ করে। আমি আমার মেশিনে 32-বিট ভাসমান (এমএসভিসি ++, উইন 64) এর জন্য এটি করেছি এবং যদিও এটি দুর্দান্ত দেখাচ্ছে।


আপনি যদি অপ্রয়োজনীয় সংখ্যা চান তবে আপনি কেন একটি যুক্ত করলেন? এবং আপনি কোন নম্বরটি ব্যবহার করেছেন বা পেয়েছেন? এবং এই হোমওয়ার্ক হয়? এবং আপনার প্রশ্নের শিরোনামটি "পূর্ণসংখ্যা" বলে তবে আপনার প্রশ্নটি "ভাসমান" বলে।
এমএসডাব্লু

5
কারণ আমি বুঝতে পেরেছিলাম যে ম্যান্টিসার সর্বোচ্চটি আমাকে সর্বোচ্চ উপস্থাপনযোগ্য নম্বর দেবে। 2 ^ 22। না, এটি একটি কৌতূহল প্রশ্ন। আমি সর্বদা ভাসা ভাসা ints লাগাতে দোষী বোধ করেছি, এমনকি যখন আমি জানি যে প্রশ্নাবলি int সবসময় খুব ছোট হতে চলেছে। আমি জানতে চাই উপরের সীমাটি কী। আমি যতদূর বলতে পারি, শিরোনাম এবং প্রশ্ন একই, কেবল আলাদাভাবে বানানো হয়েছে।
ফ্লোমি



1
@ কাইলস্ট্র্যান্ড 2 ফিরিয়েছে। আমি জানি না কেন তখন একজনের কাছে আমার কাছে অন্যটির চেয়ে বেশি সঠিক মনে হয়েছিল। এখন তারা উভয় "বিট সংখ্যা…" এর তুলনায় বিশ্রী মনে হচ্ছে
পাস্কেল কুয়াক

উত্তর:


211

2 মন্টিসার বিট + 1 + 1

প্রকাশকটির +1 (ম্যান্টিসা বিট + 1) হ'ল কারণ, ম্যান্টিসায় abcdef...এটি প্রতিনিধিত্ব করে এমন সংখ্যাটি উপস্থিত থাকলে তা হ'ল প্রকৃতপক্ষে 1.abcdef... × 2^eঅতিরিক্ত সংক্ষিপ্ত বিবরণ সরবরাহ করে।

অতএব, প্রথম পূর্ণসংখ্যা যে করতে পারবে না সঠিকভাবে উপস্থাপিত করা যেতে এবং বৃত্তাকার করা হবে:
জন্য float, 16,777,217 (2 24 + 1 টি)।
জন্য double, 9,007,199,254,740,993 (2 53 + 1 টি)।

>>> 9007199254740993.0
9007199254740992

আমি একটি ঘোষণা করেছি floatএবং এটি 16,777,217 এর সমান সেট করেছি। তবে যখন আমি এটি ব্যবহার করে coutএটি মুদ্রিত করেছি তখন ফলাফল 16,777,216। আমি ব্যবহার করছি C++। আমি কেন 16,777,217 পেতে পারি না?
সোডিয়ামনেট্রেট

18
প্রশ্নের উত্তর শিরোনাম পরীক্ষা করুন। 16777217 হ'ল প্রথম পূর্ণসংখ্যার হুবহু উপস্থাপনে অক্ষম
কেনেটিএম

ঠিক আছে ধন্যবাদ. আমি বিভ্রান্ত হয়ে পড়েছি, এ নিয়ে দুঃখিত। যদিও আমার আরও একটি প্রশ্ন রয়েছে: 16777216 এর পরে, পরবর্তী পূর্ণসংখ্যাটি 2 * 16777216 হওয়া উচিত নয়? যখন আমি একটি অনুরূপ প্রোগ্রাম চালানো, আমি 2 16777126. যোগ করে 16777218 পেতে
sodiumnitrate

5
পরবর্তী পূর্ণসংখ্যাটি প্রকৃতপক্ষে 16777218, কারণ 2 এখন শেষ উল্লেখযোগ্য বাইনারি অঙ্কে পরিণত হয়।
কেনেটিএম

6
সি ++ এ, (1 << std::numeric_limits<float>::digits) + 1এবং সি তে (1 << FLT_MANT_DIG) + 1,। প্রাক্তনটি দুর্দান্ত কারণ এটি কোনও টেমপ্লেটের অংশ হতে পারে। আপনি যদি কেবলমাত্র বৃহত্তম উপস্থাপনযোগ্য পূর্ণসংখ্য চান তবে +1 যুক্ত করবেন না।
হেনরি শ্রেইনার

38

একটি এন বিট পূর্ণসংখ্যার দ্বারা উপস্থাপিত বৃহত্তম মান হ'ল 2 এন -1। উপরে উল্লিখিত হিসাবে, floatএকটিটির তাত্পর্যপূর্ণ 24 বিট রয়েছে যা বোঝাচ্ছে যে 2 24 ফিট হবে না।

তবে

প্রকাশকের পরিসরের মধ্যে 2 এর শক্তিগুলি 1.0 × 2 n হিসাবে হুবহু উপস্থাপনযোগ্য , তাই 2 24 ফিট করতে পারে এবং ফলস্বরূপ এর জন্য প্রথম উপস্থাপনযোগ্য পূর্ণসংখ্যা float2 24 +1 হয়। উপরে উল্লিখিত. আবার।


1
এটি অন্যটির "স্পষ্টতা অতিরিক্ত অতিরিক্ত বিট" অংশটি পরিষ্কারভাবে ব্যাখ্যা করেছে। ধন্যবাদ।
chappjc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.