'ভাসা' বনাম 'ডাবল' নির্ভুলতা


155

কোড

float x  = 3.141592653589793238;
double z = 3.141592653589793238;
printf("x=%f\n", x);
printf("z=%f\n", z);
printf("x=%20.18f\n", x);
printf("z=%20.18f\n", z);

আপনাকে আউটপুট দেবে

x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116

যেখানে আউটপুট তৃতীয় লাইনের 741012573242আবর্জনা এবং চতুর্থ লাইনে 116আবর্জনা। ডাবলসের কি সর্বদা 16 টি গুরুত্বপূর্ণ চিত্র থাকে যখন ভাসমানদের কাছে সর্বদা 7 টি গুরুত্বপূর্ণ চিত্র থাকে? ডাবলসের 14 টি গুরুত্বপূর্ণ চিত্র কেন নেই?

উত্তর:


146

সিতে ফ্লোটিং পয়েন্ট নম্বরগুলি আইইইই 754 এনকোডিং ব্যবহার করে।

এই জাতীয় এনকোডিং একটি চিহ্ন, একটি তাত্পর্যপূর্ণ এবং একটি ঘনিষ্ঠ ব্যবহার করে।

এই এনকোডিংয়ের কারণে, অনেক সংখ্যার তাদের সঞ্চয় করার অনুমতি দিতে ছোট পরিবর্তন হবে।

এছাড়াও, উল্লেখযোগ্য অঙ্কগুলির সংখ্যা কিছুটা পরিবর্তন হতে পারে যেহেতু এটি একটি বাইনারি উপস্থাপনা, দশমিক নয়।

একক নির্ভুলতা (ভাসমান) আপনাকে 23 বিট অবদানের, 8 বিটের বহিরাগত এবং 1 টি বিট দেয়।

ডাবল নির্ভুলতা (ডাবল) আপনাকে 52 বিট অবদানের, 11 টি বিট এবং 1 টি বিট দেয়।


4
সি 99 করে, আগে এটি সংকলক পর্যন্ত ছিল।
অ্যালান গ্যালেন্স

21
-1 এই বিবৃতিটি স্পষ্টতই মিথ্যা: "এই এনকোডিংয়ের কারণে আপনি কখনও গ্যারান্টি দিতে পারবেন না যে আপনার মানটিতে কোনও পরিবর্তন আসবে না।"
আর .. গিথহাব বন্ধ করুন ICE

16
@ অ্যালান: সি 99 এর জন্য আইইইই ভাসমান পয়েন্টের প্রয়োজন নেই; এটি কেবল এটির প্রস্তাব দেয়।
আর .. গিথহাব বন্ধ করুন ICE

4
@ অ্যালান: আর .. সঠিক; আনেকেক্স এফ (যা আইইইই -754 বাইন্ডিংগুলি নির্দিষ্ট করে) আদর্শিক, তবে কেবল কার্যকর হয় যদি বাস্তবায়ন সংজ্ঞায়িত হয় __STDC_IEC_559__। এমন একটি বাস্তবায়ন যা ম্যাক্রো সংজ্ঞায়িত করে না যে আইইইই -754 অনুসারে অবাধ।
স্টিফেন ক্যানন

12
@Alan: আইইইই অধীনে 754, এটি সহজে নিশ্চিত এর মান পরিবর্তন নেই 0.5, 0.046875অথবা 0.376739501953125তাদের দশমিক উপস্থাপনা বনাম। (এগুলি হ'ল ম্যান্টিসায় সংখ্যাযুক্ত এবং ঘৃণ্যকারীর সাথে মানানসই ফিচারগুলির বেস -২ লোগারিথের সাথে ফিটিং যুক্ত ডায়াডিক যুক্তি))
আর .. গিথহাব বন্ধ করুন সহায়তা ICE

42

ডাবলসের কি সর্বদা 16 টি গুরুত্বপূর্ণ চিত্র থাকে যখন ভাসমানদের কাছে সর্বদা 7 টি গুরুত্বপূর্ণ চিত্র থাকে?

না। ডাবলগুলির সর্বদা 53 টি উল্লেখযোগ্য বিট থাকে এবং ভাসমানের সর্বদা 24 টি গুরুত্বপূর্ণ বিট থাকে (ডেনারমালস, ইনফিনিটিস এবং এনএএন মানগুলি বাদে তবে সেগুলি একটি পৃথক প্রশ্নের বিষয়)। এগুলি বাইনারি ফর্ম্যাটগুলি এবং আপনি কেবল বাইনারি অঙ্কগুলির (বিট) পদে তাদের উপস্থাপনের নির্ভুলতা সম্পর্কে স্পষ্টভাবে বলতে পারেন।

এটি বাইনারি পূর্ণসংখ্যায় কয়টি অঙ্ক সংরক্ষণ করতে পারে তার প্রশ্নের সাথে মিলে যায়: একটি স্বাক্ষরবিহীন 32 বিট পূর্ণসংখ্যা 32 বিট পর্যন্ত পূর্ণসংখ্যা সংরক্ষণ করতে পারে, যা কোনও সংখ্যক দশমিক সংখ্যায় সুনির্দিষ্টভাবে মানচিত্র দেয় না: সমস্ত অবধি অবধি 9 দশমিক সংখ্যা সংরক্ষণ করা যেতে পারে তবে 10-সংখ্যার সংখ্যাও পাশাপাশি সংরক্ষণ করা যেতে পারে।

ডাবলসের 14 টি গুরুত্বপূর্ণ চিত্র কেন নেই?

একটি ডাবলের এনকোডিংয়ে b৪ বিট (চিহ্নের জন্য 1 বিট, ঘাঁটিঘাঁটিকারী 11 টি বিট, 52 স্পষ্টত তাৎপর্যপূর্ণ বিট এবং একটি অন্তর্নিহিত বিট) ব্যবহার করা হয় যা একটি ফ্লোট (32 বিট) উপস্থাপন করতে ব্যবহৃত বিটের দ্বিগুণ


15

ভাসা: তাত্পর্যপূর্ণ 23 বিট, ঘোষকের 8 বিট, এবং 1 চিহ্ন বিট।

ডাবল: 52 বিট অব তাৎপর্য, 11 বিট এক্সপোনেন্ট এবং 1 টি বিট।


11

এটি সাধারণত ভিত্তি 10 নয়, বেস 2-তে উল্লেখযোগ্য এবং তাত্পর্যপূর্ণ উভয়ের গুরুত্বপূর্ণ পরিসংখ্যানের উপর ভিত্তি করে নির্মিত হয় আমি C99 স্ট্যান্ডার্ডে যা বলতে পারি তা থেকে তবে, ভাসমান এবং ডাবলসের জন্য কোনও নির্দিষ্ট নির্ভুলতা নেই (1 এবং 1 + 1E-5/ 1 + 1E-7স্বতন্ত্র [ floatএবং doubleপ্রতিক্রিয়াশীল]]। তবে, উল্লেখযোগ্য পরিসংখ্যানগুলির সংখ্যা প্রয়োগকারীকে রেখে দেওয়া হয়েছে (পাশাপাশি তারা অভ্যন্তরীণভাবে কোন বেসটি ব্যবহার করে, সুতরাং অন্য কথায়, একটি বাস্তবায়ন এটি বেস 3 এর যথাযথতার 18 টি সংখ্যার ভিত্তিতে তৈরি করার সিদ্ধান্ত নিতে পারে)। [1]

আপনার যদি এই মানগুলি জানতে হয় তবে ধ্রুবকগুলি FLT_RADIXএবং FLT_MANT_DIG(এবং DBL_MANT_DIG/ LDBL_MANT_DIG) ফ্লোট শটে সংজ্ঞায়িত করা হয়।

এটিকে কারণ হিসাবে এটি বলা doubleহয় কারণ এটি সঞ্চয় করতে ব্যবহৃত বাইটের সংখ্যা একটি ফ্লোটের সংখ্যার দ্বিগুণ (তবে এতে ক্ষতিকারক এবং তাত্পর্যপূর্ণ উভয়ই অন্তর্ভুক্ত থাকে)। আইইইই 754 স্ট্যান্ডার্ড (বেশিরভাগ সংকলক দ্বারা ব্যবহৃত) ব্যয়কারীর তুলনায় তাত্পর্যপূর্ণ জন্য আরও বিট বরাদ্দ করে ( float52 থেকে 12 বনামের জন্য 23 থেকে 9 double), যার কারণে নির্ভুলতা দ্বিগুণের চেয়ে বেশি হয়।

1: বিভাগ 5.2.4.2.2 ( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf )


ভুল টাইপ করেছেন? C89 সর্বাধিক একজন Epsilon প্রয়োজন 1E-9জন্য double, না 1E-7
রাফলউইন্ড

10

একটি ফ্লোটে যথাযথ 23 বিট থাকে এবং ডাবলটিতে 52 থাকে।


বিশদ: বাইনারি 64 এর একটি 53 বিট তাৎপর্যপূর্ণ (52 সুস্পষ্টভাবে সঞ্চিত) বাইনারি 32 এর 24 বিট (স্পষ্টত 23 টি সঞ্চয়) রয়েছে।
chux - মনিকা পুনরায় ইনস্টল করুন

4

আইইইই 754 কীভাবে কাজ করে এটি ডাবল স্পষ্টতা নয় এবং বাইনারি সত্যিকার অর্থে দশমিকের সাথে ভাল অনুবাদ করে না। আপনার আগ্রহী হলে মানটি একবার দেখুন।


4

ভাসমান বলতে ভাসমান পয়েন্ট সংখ্যা বোঝায় C সি-তে, সেই সংখ্যাগুলিতে ফ্লোট ডেটা টাইপ ব্যবহৃত হয় যেখানে মোট অঙ্কের সংখ্যার যথার্থতা 7.. উদাহরণস্বরূপ: - দশমিক সংখ্যা। 12.3546987 ফ্লোটে সংরক্ষণ করা যায় না কারণ এটিতে মোট 9 টি সংখ্যা রয়েছে output আউটপুটটি 12.354699 হিসাবে প্রদর্শিত হবে অর্থাৎ প্রথম 7 টি অঙ্কটি ইনপুটটিতে প্রবেশ করানো হিসাবে দেখানো হবে এবং 8 তম সংখ্যাটি বৃত্তাকার বন্ধ হবে flo ফ্লোট প্রকারটি মানগুলি উপস্থাপন করতে পারে আনুমানিক 1.5 x 10 ^ (- 45) থেকে 3.4 x 10 ^ (38) অবধি। মেমরি বরাদ্দের শর্তে, ভাসাটি একক নির্ভুলতা, 32-বিট ভাসমান পয়েন্ট ডেটা টাইপ।

ভাসমানের বিপরীতে, ডাবলটির 15 থেকে 16 ডিজিটের যথার্থতা রয়েছে double ডাবলটির পরিসর 5.0 × 10 ^ (- 345) থেকে 1.7 × 10 ^ (308) হয় by বাইট বরাদ্দের শর্তে, ডাবলটি একটি 64-বিট ভাসমান পয়েন্ট ডেটা টাইপ করুন।

সমস্যাটি এর ব্যবহারে দেখা দেয় lo ফ্লোট বা ডাবল প্রিন্টফকে প্রভাবিত করে না তবে স্ক্যানফের ক্ষেত্রে যথাযথ ডাটা টাইপটি মোট নংয়ের উপর নির্ভর করে ব্যবহার করা উচিত। ভাসমান নম্বরে অঙ্কের এটি ইনপুট থেকে পড়তে হবে।

তথ্যের উচ্চতর নির্ভুলতার জন্য ভাসমানের চেয়ে দ্বিগুণ পছন্দ হয়।

আশাকরি এটা সাহায্য করবে.

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