ভাসমান অসম্পূর্ণতার কারণে বৈষম্য


15

অন্তত জাভাতে, যদি আমি এই কোডটি লিখি:

float a = 1000.0F;
float b = 0.00004F;
float c = a + b + b;
float d = b + b + a;
boolean e = c == d;

মান হবে । আমি বিশ্বাস করি যে সংখ্যার সঠিকভাবে প্রতিনিধিত্ব করার পথে ভাসমানগুলি খুব সীমাবদ্ধ এই কারণে ঘটেছিল। কিন্তু আমি বুঝতে পারছি না কেন শুধু অবস্থান পরিবর্তন না এই বৈষম্য সৃষ্টি করতে পারে।f a l s e aএকটিগুলিএকটি

আমি নীচে হিসাবে উভয় লাইনে 3 এবং 4 লাইনে এসকে হ্রাস করেছি , তবে এর মানটি হয়ে যায় :টি আর ইউ টিRতোমার দর্শন লগ করা

float a = 1000.0F;
float b = 0.00004F;
float c = a + b;
float d = b + a;
boolean e = c == d;

3 এবং 4 লাইনে ঠিক কী ঘটেছিল? কেন ভাসা সংযোজন অপারেশন সাহসী হয় না?

আগাম ধন্যবাদ.


16
আপনার উদাহরণ যেমন দেখায়, ফ্লোটিং পয়েন্ট উপরন্তু হল বিনিময়। তবে এটি সাহসী নয়।
যুবাল ফিল্মাস

1
আমি আপনাকে বেসিক সংজ্ঞাটি দেখতে উত্সাহিত করি। এটিও লক্ষ করুন যে সংকলকটি ( বামে হিসাবে পার্স করে । ( আর + এস ) + টিR+ +গুলি+ +টি(R+ +গুলি)+ +টি
যুবাল ফিল্মাস

2
দেখুন কেন এই তাই হতে হবে একটি সহজ উপায়, বিবেচনা করুন Xএকটি খুব বড় সংখ্যা এবং Yএকটি খুব ছোট সংখ্যা, যেমন যে X + Y = X। এখানে, X + Y + -Xশূন্য হবে। তবে X + -X + Yহবে Y
ডেভিড শোয়ার্টজ


উত্তর:


20

সাধারণ ভাসমান পয়েন্ট বাস্তবায়নে, একক অপারেশনের ফলাফল এমনভাবে উত্পন্ন হয় যেন অপারেশন অসীম নির্ভুলতার সাথে সম্পাদিত হয়েছিল এবং তারপরে নিকটস্থ ভাসমান-পয়েন্ট সংখ্যার সাথে গোল করে।

এবং তুলনা করুন : অসীম নির্ভুলতার সাথে সঞ্চালিত প্রতিটি অপারেশনের ফলাফল একই, সুতরাং এই অভিন্ন অনন্ত নির্ভুলতার ফলাফলগুলি একটি অভিন্ন উপায়ে বৃত্তাকার হয়। অন্য কথায়, ভাসমান-পয়েন্ট সংযোজন কমিটিকেটিভ।b + aএকটি+ ++ +একটি

নিন : একটি ভাসমান-পয়েন্ট নম্বর। সঙ্গে বাইনারি ফ্লোটিং পয়েন্ট সংখ্যা, একটি ফ্লোটিং পয়েন্ট নম্বর (এক্সপোনেন্ট একের পর বড়), তাই কোনো rounding ত্রুটি ছাড়া যোগ করা হয়। তারপর যোগ করা হয় সঠিক মান । ফল সঠিক মান নিকটতম ফ্লোটিং পয়েন্ট সংখ্যাতে বৃত্তাকার।বি 2 বি বি + বি বি + বি বি + + ++ +একটি2+ +একটি+ +2+ +একটি

নিন : যুক্ত করা হবে, এবং একটি গোলাকার ত্রুটি হবে , সুতরাং আমরা ফলাফলটি পেয়েছি । যোগ , আর ফল সঠিক মান নিকটতম ফ্লোটিং পয়েন্ট সংখ্যাতে বৃত্তাকার।একটি+ ++ +একটি+ +Rএকটি+ ++ +R2+ +একটি+ +R

সুতরাং এক ক্ষেত্রে, , গোল করা হয়েছে। অন্য ক্ষেত্রে, , গোলাকার।2+ +একটি2+ +একটি+ +R

পুনশ্চ. দুটি নির্দিষ্ট সংখ্যার জন্য এবং উভয় গণনা একই ফলাফল দেয় কি না তা সংখ্যার উপর নির্ভর করে, এবং গণনায় গোলাকার ত্রুটির উপর নির্ভর করে এবং সাধারণত অনুমান করা শক্ত। একক বা দ্বিগুণ নির্ভুলতা ব্যবহার করা নীতিগতভাবে সমস্যার সাথে কোনও তাত্পর্য তৈরি করে না, তবে যেহেতু বৃত্তাকার ত্রুটিগুলি পৃথক, সেখানে এক এবং খ এর মান থাকবে যেখানে একক নির্ভুলতায় ফলাফলগুলি সমান এবং ডাবল নির্ভুলতায় তারা নয়, বা বিপরীতে। নির্ভুলতা অনেক বেশি হবে তবে দুটি উদ্ভিদ গাণিতিকভাবে একই তবে ভাসমান-পয়েন্ট পাটিগণিতের ক্ষেত্রে একই নয় বলে সমস্যা।একটিএকটি+ +

PPS। কিছু ভাষায়, ভাসমান পয়েন্ট গণিতের উচ্চতর নির্ভুলতা বা সংখ্যার একটি উচ্চতর পরিসীমা সহ বাস্তব বিবরণীর দ্বারা দেওয়া হতে পারে। সেক্ষেত্রে, এটি অনেক বেশি সম্ভাবনা (তবে এখনও নিশ্চিত নয়) যে উভয় রাশি একই ফলাফল দেয়।

PPPS। একটি মন্তব্য জিজ্ঞাসা করা হয়েছিল যে আমাদের জিজ্ঞাসা করা উচিত কিনা ভাসমান পয়েন্ট সংখ্যা সমান কিনা বা আদৌ নয়। আপনি যদি কী জানেন তবে অবশ্যই। উদাহরণস্বরূপ, আপনি যদি একটি অ্যারে বাছাই করে থাকেন, বা একটি সেট প্রয়োগ করেন, আপনি যদি "প্রায় সমান" এর কিছু ধারণা ব্যবহার করতে চান তবে নিজেকে ভয়াবহ সমস্যায় ফেলবেন। গ্রাফিক্যাল ইউজার ইন্টারফেসে আপনাকে যদি কোনও বস্তুর আকার পরিবর্তন হয়ে থাকে তবে আপনাকে অবজেক্টের আকারগুলি পুনরায় গণনার প্রয়োজন হতে পারে - আপনি পুনরায় গণনাটি এড়াতে ওল্ড সাইজ == নিউ সাইজের তুলনা করুন, জেনে রাখবেন যে অনুশীলনে আপনার প্রায় প্রায় অভিন্ন আকার থাকে না, এবং আপনার প্রোগ্রামটি সঠিক এমনকি যদি কোনও অপ্রয়োজনীয় পুনঃব্যবস্থা হয়।


এই বিশেষ ক্ষেত্রে, খ বাইনারি রূপান্তরিত হওয়ার সময় পর্যায়ক্রমিক হয়ে ওঠে, তাই সর্বত্র গোলাকার ত্রুটি রয়েছে।
আন্দ্রে সৌজা লেমোস

1
bএই উত্তরটির উত্তর @ আন্দ্রেসুজা লিমোস 0.00004 নয়, রূপান্তর এবং গোল করার পরে আপনি যা পেয়েছেন তা এটি ।
আলেক্সি রোমানভ

"সাধারণ ভাসমান পয়েন্ট বাস্তবায়নে, একক অপারেশনের ফলাফল এমনভাবে তৈরি হয় যেন অপারেশন অসীম নির্ভুলতার সাথে সম্পাদিত হয়েছিল, এবং তারপরে নিকটতম ভাসমান-বিন্দু সংখ্যায় গোল হয়ে গেছে।" - এটি স্পেসিফিকেশন দ্বারা বাধ্যতামূলক, আমার হতাশার অনেকটাই যখন আমি যুক্তি গেটগুলির ক্ষেত্রে এটি বাস্তবায়নের চেষ্টা করেছি (সিমুলেটর কেবলমাত্র -৪-বিট বাস পরিচালনা করতে পারে)।
জন ডিভোরাক

নিষ্পাপ প্রশ্ন: ভাসমান সাম্যের জন্য পরীক্ষা করা কি কখনও অর্থবোধ করে? কেন বেশিরভাগ প্রোগ্রামিং ভাষাগুলি এএ == বি পরীক্ষার অনুমতি দেয় যেখানে উভয় বা একটিই ভাসমান?
কৌতূহলী_কাট

উইকিপিডিয়া থেকে প্রাসঙ্গিক সংজ্ঞা: " মেশিন এপসিলন ভাসমান পয়েন্টের গাণিতিকের বৃত্তাকার কারণে আপেক্ষিক ত্রুটির উপরের একটি বাউন্ড দেয়।"
ব্ল্যাকহক

5

কম্পিউটার দ্বারা সমর্থিত বাইনারি ফ্লোটিং পয়েন্ট ফর্ম্যাটটি মূলত মানুষের ব্যবহৃত দশমিক বৈজ্ঞানিক স্বরলিপিগুলির অনুরূপ।

একটি ভাসমান-পয়েন্ট নম্বরটিতে একটি চিহ্ন, ম্যান্টিসা (স্থির প্রস্থ) এবং এক্সপোনেন্ট (নির্দিষ্ট প্রস্থ) থাকে:

+/-  1.0101010101 × 2^12345
sign   ^mantissa^     ^exp^

নিয়মিত বৈজ্ঞানিক স্বরলিপিটির অনুরূপ বিন্যাস রয়েছে:

+/- 1.23456 × 10^99

আমরা যদি প্রতিটি অপারেশনের পরে গোল করে সীমাবদ্ধ নির্ভুলতার সাথে বৈজ্ঞানিক স্বরলিপিতে পাটিগণিত করি, তবে আমরা বাইনারি ভাসমান পয়েন্টের মতো সমস্ত খারাপ প্রভাব পাই।


উদাহরণ

উদাহরণস্বরূপ, ধরুন আমরা দশমিক বিন্দুর পরে ঠিক 3 ডিজিট ব্যবহার করি।

a = 99990 = 9.999 × 10^4
b =     3 = 3.000 × 10^0

(a + b) + খ

এখন আমরা গণনা:

c = a + b
  = 99990 + 3      (exact)
  = 99993          (exact)
  = 9.9993 × 10^4  (exact)
  = 9.999 × 10^4.  (rounded to nearest)

পরবর্তী পদক্ষেপে অবশ্যই:

d = c + b
  = 99990 + 3 = ...
  = 9.999 × 10^4.  (rounded to nearest)

অতএব (একটি + খ) + বি = 9.999 4 10 4

(খ + বি) + এ

তবে আমরা যদি অপারেশনগুলি অন্য কোনও ক্রমে করি:

e = b + b
  = 3 + 3  (exact)
  = 6      (exact)
  = 6.000 × 10^0.  (rounded to nearest)

পরবর্তী আমরা গণনা:

f = e + a
  = 6 + 99990      (exact)
  = 99996          (exact)
  = 9.9996 × 10^4  (exact)
  = 1.000 × 10^5.  (rounded to nearest)

সুতরাং (খ + বি) + এ = 1.000 × 10 5 , যা আমাদের অন্যান্য উত্তরের চেয়ে পৃথক।


5

জাভা আইইইই 754 বাইনারি ফ্লোটিং পয়েন্ট উপস্থাপনা ব্যবহার করে, যা মেন্টিসায় 23 বাইনারি অঙ্ক উত্সর্গ করে, যা প্রথম উল্লেখযোগ্য অঙ্কের সাথে বাদ দেওয়া (স্থান বাঁচাতে) বাদ দিয়ে স্বাভাবিক করা হয়।

0,0000410=0,00000000000000101001111100010110101100010001110001101101000111 ...2=[1।]01001111100010110101100010001110001101101000111 ...2×2-15

100010+ +0,0000410=1111101000,00000000000000101001111100010110101100010001110001101101000111 ...2=[1।]11110100000000000000000101001111100010110101100010001110001101101000111 ...2×29

লাল রঙের অংশগুলি হ'ল ম্যান্টিসাস, কারণ এগুলি প্রকৃতপক্ষে প্রদর্শিত হয় (বৃত্তাকার আগে)।

(100010+ +0,0000410)+ +0,0000410(0,0000410+ +0,0000410)+ +100010


0

আমরা সম্প্রতি একটি একই গোলাকার ইস্যুতে দৌড়েছি। উপরে উল্লিখিত উত্তরগুলি সঠিক, তবে বেশ প্রযুক্তিগত।

রাউন্ডিং ত্রুটি কেন বিদ্যমান তা সম্পর্কে আমি নীচেরটিকে একটি ভাল ব্যাখ্যা বলে মনে করেছি। http://csharpindepth.com/Articles/General/FloatingPoint.aspx

টিএলডিআর: বাইনারি ভাসমান পয়েন্টগুলি দশমিক ভাসমান পয়েন্টগুলিতে সঠিকভাবে ম্যাপ করা যায় না। এটি গাণিতিক ক্রিয়াকলাপের সময় সংশ্লেষ করতে পারে এমন ভুল সংঘর্ষের কারণ ঘটায়।

দশমিক ভাসমান সংখ্যা ব্যবহার করে একটি উদাহরণ: 1/3 + 1/3 + 1/3 সাধারণত 1 এর সমান হবে তবে দশমিকের মধ্যে: 0.333333 + 0.333333 + 0.333333 কখনই 1.000000 এর সমান হয় না

বাইনারি দশমিকগুলিতে গাণিতিক ক্রিয়াকলাপ করার সময় একই ঘটে।

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