দুটি অসম ভাসমান পয়েন্ট সংখ্যা বিয়োগ করে 0 পাওয়া কি সম্ভব?


131

নিম্নলিখিত উদাহরণে 0 (বা অনন্ত) দ্বারা ভাগ পাওয়া সম্ভব?

public double calculation(double a, double b)
{
     if (a == b)
     {
         return 0;
     }
     else
     {
         return 2 / (a - b);
     }
}

সাধারণ ক্ষেত্রে অবশ্যই তা হবে না। কিন্তু কি যদি aএবং bখুব ঘনিষ্ঠ পারেন হয় (a-b)হচ্ছে ফলে 0হিসাব স্পষ্টতা কারণে?

নোট করুন যে এই প্রশ্নটি জাভার জন্য, তবে আমি মনে করি এটি বেশিরভাগ প্রোগ্রামিং ভাষার ক্ষেত্রে প্রযোজ্য।


49
আমাকে ডাবলসের সমস্ত সংমিশ্রণ চেষ্টা করতে হবে, এতে কিছুটা সময় লাগবে :)
থ্রিলার

3
@ থারিলারের কাছে আমার কাছে ইউএনআইটি টেস্টিং ব্যবহার করার মতো সময় মনে হচ্ছে!
ম্যাট ক্লার্ক

7
ব্লুব্যাবরেইন, আমার অনুমান যে আপনার আক্ষরিক সংখ্যা ২,০০০ ইত্যাদি অনেকগুলি দশমিক দশকে একটি ফ্লোট দ্বারা প্রতিনিধিত্ব করার জন্য রয়েছে। সুতরাং শেষগুলি তুলনা করে প্রকৃত ব্যবহৃত সংখ্যা দ্বারা প্রতিনিধিত্ব করা হবে না।
থ্রিলার

4
@ থার্লার সম্ভবত 'আপনি সত্যিই গ্যারান্টি দিতে পারবেন না যে আপনি ভাসা বা
ডাবলকে

4
কেবলমাত্র নোট করুন যে 0 টি ক্ষেত্রে ফিরে আসা হার্ড-টু-ডিবাগ দ্ব্যর্থহীনতার দিকে পরিচালিত করতে পারে, তাই নিশ্চিত হন যে আপনি ব্যতিক্রম ছুঁড়ে ফেলার পরিবর্তে বা কোনও এনএএন ফিরিয়ে না দেওয়ার পরিবর্তে 0টি ফিরে আসতে চান।
m0skit0

উত্তর:


132

জাভা সালে a - bথেকে সমান না হয় 0যদি a != b। এটি কারণ জাভা আইএনইই 754 ভাসমান পয়েন্ট অপারেশনগুলি নির্দেশ করে যা ডেনোরালাইজড সংখ্যার সমর্থন করে। অনুমান থেকে :

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

যদি কোনও এফপিইউ অস্বীকৃত সংখ্যার সাথে কাজ করে , অসম সংখ্যাগুলি বিয়োগ করে কখনই শূন্য উৎপন্ন করতে পারে না (গুণটির বিপরীতে), এই প্রশ্নটিও দেখুন

অন্যান্য ভাষার ক্ষেত্রে এটি নির্ভর করে। সি বা সি ++ এ, উদাহরণস্বরূপ, আইইইই 754 সমর্থনটি isচ্ছিক।

এটি বলেছিল, এক্সপ্রেশনটি উপচে পড়া সম্ভব2 / (a - b) , উদাহরণস্বরূপ a = 5e-308এবং এর সাথে b = 4e-308


4
তবে ওপি 2 / (আব) সম্পর্কে জানতে চায়। এটি কি সসীম হওয়ার নিশ্চয়তা দেওয়া যেতে পারে?
তাইমির

উত্তরের জন্য ধন্যবাদ, আমি অস্বীকৃত সংখ্যার ব্যাখ্যার জন্য উইকিপিডিয়ায় একটি লিঙ্ক যুক্ত করেছি।
থ্রিলার

3
আমার পছন্দগুলি দেখুন বিভাগটি আসলে উপচে পড়তে পারে।
nwellnhof

@ টেইমির (a,b) = (3,1)=> 2/(a-b) = 2/(3-1) = 2/2 = 1আইইইই ভাসমান পয়েন্টের সাথে এটি সত্য কিনা, আমি জানি না
কোল জনসন

1
@ ড্র্রুডোরম্যান আইইইই 754 সি 99 এর জন্যও alচ্ছিক। স্ট্যান্ডার্ডের অ্যাঙ্কেক্স এফ দেখুন।
nwellnhof

50

একটি কর্মক্ষেত্র হিসাবে, নিম্নলিখিত সম্পর্কে কি?

public double calculation(double a, double b) {
     double c = a - b;
     if (c == 0)
     {
         return 0;
     }
     else
     {
         return 2 / c;
     }
}

এইভাবে আপনি কোনও ভাষায় আইইইই সাপোর্টের উপর নির্ভর করেন না।


6
সমস্যা এড়ান এবং একবারে পরীক্ষাটি সহজ করে দিন ify আমার মত.
জোশুয়া

11
-1 যদি a=b, আপনি ফিরে আসা উচিত নয় 0। দ্বারা ভাগ 0আইইইই 754 আপনি অনন্ত, না একটি ব্যতিক্রম পায়। আপনি সমস্যা এড়াচ্ছেন, সুতরাং ফিরে আসা 0একটি বাগ হওয়ার জন্য অপেক্ষা করছে a বিবেচনা করুন 1/x + 1। যদি x=0, এর ফলাফল হয় 1, সঠিক মান নয়: অনন্ত।
কোল জনসন

5
@ কোল জনসন সঠিক উত্তরটিও অসীম নয় (যদি না আপনি সীমাটি কোন দিক থেকে এসে থাকেন তবে ডান দিক = + ইনফ, বাম দিক = -inf, অনির্ধারিত = অপরিবর্তিত বা নাএন))
নিক টি

12
@ ক্রিসহেইস: এই প্রশ্নটি একটি এক্সওয়াই সমস্যা হতে পারে তা স্বীকার করে এই প্রশ্নের একটি বৈধ উত্তর: মেটা.স্ট্যাকেক্সেঞ্জার.কম
সেকশনস

17
@ কোল জনসন রিটার্নিং 0আসলে সমস্যা নয়। প্রশ্নে ওপি এটিই করে। আপনি ব্লকের সেই অংশের জন্য উপযুক্ত ব্যতিক্রম বা যা কিছু উপযুক্ত রাখতে পারেন। আপনি যদি ফিরতে পছন্দ করেন না 0, তবে এই প্রশ্নের সমালোচনা করা উচিত। অবশ্যই, ওপি হিসাবে করা উত্তরের একটি ডাউনভোটের নিশ্চয়তা দেয় না। প্রদত্ত ফাংশনটি সম্পূর্ণ হওয়ার পরে এই গণনার আরও গণনাগুলির সাথে কোনও সম্পর্ক নেই। আপনারা জানেন সবার জন্য, প্রোগ্রামটির প্রয়োজনীয়তাগুলি ফিরে আসার প্রয়োজন 0
jpmc26

25

মানটি নির্বিশেষে আপনি শূন্য দ্বারা ভাগ পাবেন না a - b, যেহেতু 0 দ্বারা ভাসমান পয়েন্ট বিভাগ একটি ব্যতিক্রম ছুঁড়ে না। এটি অনন্ত ফিরে আসে।

এখন, একমাত্র উপায় a == bসত্য ফিরে আসবে যদি aএবং bসঠিক একই বিট ধারণ করে। যদি তারা কেবলমাত্র কমপক্ষে উল্লেখযোগ্য বিটের দ্বারা পৃথক হয় তবে তাদের মধ্যে পার্থক্য 0 হবে না।

সম্পাদনা:

বাথশেবা যেমন সঠিকভাবে মন্তব্য করেছেন তেমন কিছু ব্যতিক্রম রয়েছে:

  1. "কোনও সংখ্যা তুলনা করে না" নিজের সাথে মিথ্যা তবে একই বিট নিদর্শনগুলি থাকতে পারে।

  2. -0.0 +0.0 এর সাথে সত্যের তুলনা করতে সংজ্ঞায়িত করা হয় এবং তাদের বিট নিদর্শনগুলি আলাদা।

সুতরাং উভয় যদি aএবং bহয় Double.NaN, আপনি অন্য দফা কাছে পৌঁছে যাবে, কিন্তু যেহেতু NaN - NaNএছাড়াও আয় NaN, আপনি শূন্য দ্বারা ভাগ করা হবে না।


11
Eran; কঠোরভাবে সত্য নয়। "কোনও সংখ্যা তুলনা করে না" নিজের সাথে মিথ্যা তবে একই বিট নিদর্শনগুলি থাকতে পারে। এছাড়াও -0.0 +0.0 এর সাথে সত্যের তুলনা করতে সংজ্ঞায়িত করা হয় এবং তাদের বিট নিদর্শনগুলি আলাদা।
বাথশেবা

1
@ বাথশেবা আমি এই বিশেষ ক্ষেত্রে বিবেচনা করি নি। মন্তব্যের জন্য ধন্যবাদ.
ইরান

2
@ ইরান, খুব ভাল পয়েন্ট যে 0 দ্বারা বিভাজন একটি ভাসমান পয়েন্টে অসীমতা ফিরে আসবে। এটি প্রশ্নের সাথে যুক্ত হয়েছে।
থ্রিলার

2
@ প্রশান্ত কিন্তু বিভাগটি এই ক্ষেত্রে সংঘটিত হবে না, যেহেতু a == খ সত্য হয়ে যাবে।
ইরান

3
আসলে আপনি শূন্য দ্বারা বিভাজনের জন্য একটি এফপি ব্যতিক্রম পেতে পারেন , এটি আইইইই -754 স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত একটি বিকল্প, যদিও এটি সম্ভবত "ব্যতিক্রম" দিয়ে বোঝানো সম্ভবত নয়;)
ভু

17

এখানে শূন্য দ্বারা বিভাজন ঘটতে পারে এমন কোনও ঘটনা নেই।

শ্রীমতি সমাধানকারী Z3 ফ্লোটিং পয়েন্ট গাণিতিক সুনির্দিষ্ট আইইইই সমর্থন করে। আসুন জেড 3 কে নম্বর aএবং bএরকম সন্ধান করতে বলুন a != b && (a - b) == 0:

(set-info :status unknown)
(set-logic QF_FP)
(declare-fun b () (FloatingPoint 8 24))
(declare-fun a () (FloatingPoint 8 24))
(declare-fun rm () RoundingMode)
(assert
(and (not (fp.eq a b)) (fp.eq (fp.sub rm a b) +zero) true))
(check-sat)

ফলাফল হয় UNSAT। এরকম কোনও সংখ্যা নেই।

উপরের এসএমটিআইএলবি স্ট্রিং জেড 3 কে একটি স্বেচ্ছাসেবী রাউন্ডিং মোড চয়ন করতে সহায়তা করে ( rm)। এর মানে হল যে ফলাফলটি সম্ভাব্য সকল রাউন্ডিং মোডের জন্য রয়েছে (যার মধ্যে পাঁচটি রয়েছে)। NaNফলাফলটিতে প্লে-তে যে কোনও ভেরিয়েবল হতে পারে বা অসীমতার সম্ভাবনাও রয়েছে।

a == bfp.eqমানের হিসাবে প্রয়োগ করা হয় যাতে সমান +0fএবং -0fতুলনা। শূন্যের সাথে তুলনাটি fp.eqপাশাপাশি ব্যবহার করা হয়। যেহেতু প্রশ্নটি শূন্যের দ্বারা বিভাজন এড়ানোর লক্ষ্যে এটি উপযুক্ত তুলনা।

যদি সাম্যতা পরীক্ষাটি বিটওয়াইজ সমতা ব্যবহার করে বাস্তবায়ন করা হত , +0fএবং শূন্য -0fকরার উপায় ছিল a - b। এই উত্তরের একটি ভুল পূর্ববর্তী সংস্করণে কৌতূহলীদের জন্য সেই মামলার মোডের বিশদ রয়েছে।

জেড 3 অনলাইন এখনও এফপিএ তত্ত্ব সমর্থন করে না। এই ফলাফলটি সর্বশেষতম অস্থির শাখা ব্যবহার করে প্রাপ্ত হয়েছিল। এটি নীচে NET বাইন্ডিং ব্যবহার করে পুনরুত্পাদন করা যেতে পারে:

var fpSort = context.MkFPSort32();
var aExpr = (FPExpr)context.MkConst("a", fpSort);
var bExpr = (FPExpr)context.MkConst("b", fpSort);
var rmExpr = (FPRMExpr)context.MkConst("rm", context.MkFPRoundingModeSort());
var fpZero = context.MkFP(0f, fpSort);
var subExpr = context.MkFPSub(rmExpr, aExpr, bExpr);
var constraintExpr = context.MkAnd(
        context.MkNot(context.MkFPEq(aExpr, bExpr)),
        context.MkFPEq(subExpr, fpZero),
        context.MkTrue()
    );

var smtlibString = context.BenchmarkToSMTString(null, "QF_FP", null, null, new BoolExpr[0], constraintExpr);

var solver = context.MkSimpleSolver();
solver.Assert(constraintExpr);

var status = solver.Check();
Console.WriteLine(status);

আইইইই ভাসা প্রশ্নের উত্তর দিতে Z3 ব্যবহার চমৎকার, কারণ এটি মামলা তত্ত্বাবধান করা (যেমন কঠিন হয় NaN, -0f, +-inf) এবং আপনার নির্বিচারে প্রশ্ন করতে পারেন। স্পেসিফিকেশন ব্যাখ্যা এবং উদ্ধৃত করার প্রয়োজন নেই। এমনকি আপনি মিশ্র ভাসা এবং পূর্ণসংখ্যার প্রশ্নগুলি জিজ্ঞাসা করতে পারেন যেমন "এটি কি এই নির্দিষ্ট int log2(float)অ্যালগরিদমটি সঠিক?"


আপনি কি এসএমটি সলভার জেড 3-এর একটি লিঙ্ক এবং একটি অনলাইন দোভাষীকে একটি লিঙ্ক যুক্ত করতে পারেন? যদিও এই উত্তরটি পুরোপুরি বৈধ বলে মনে হচ্ছে, কেউ ভাবতে পারেন যে এই ফলাফলগুলি ভুল।
AL

12

সরবরাহিত কার্যটি প্রকৃতপক্ষে অনন্ত ফিরে আসতে পারে:

public class Test {
    public static double calculation(double a, double b)
    {
         if (a == b)
         {
             return 0;
         }
         else
         {
             return 2 / (a - b);
         }
    }    

    /**
     * @param args
     */
    public static void main(String[] args) {
        double d1 = Double.MIN_VALUE;
        double d2 = 2.0 * Double.MIN_VALUE;
        System.out.println("Result: " + calculation(d1, d2)); 
    }
}

আউটপুট হয় Result: -Infinity

বিভাগের ফলাফলটি যখন একটি ডাবল সঞ্চিত করতে বৃহত হয়, তখন ডিনোমিনিটারটি শূন্য না হলেও অনন্ত ফিরে আসে।


6

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

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

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


6

আইইইইই 754 এর পূর্বে পুরানো সময়ে, এটি সম্ভবত সম্ভব ছিল যে a! = B আবকে বোঝায় না! = 0 এবং বিপরীতে। এটি প্রথম স্থানে আইইইই 754 তৈরির অন্যতম কারণ ছিল।

আইইইই 754 এর সাথে এটি প্রায় গ্যারান্টিযুক্ত। সি বা সি ++ সংকলকগুলিকে প্রয়োজনের চেয়ে উচ্চতর নির্ভুলতার সাথে একটি অপারেশন করার অনুমতি দেওয়া হয়। সুতরাং a এবং b যদি ভেরিয়েবল না হয়েও এক্সপ্রেশন হয় তবে (a + b)! = C বোঝায় না (a + b) - c! = 0, কারণ a + b একবার উচ্চতর নির্ভুলতার সাথে গণনা করা যেতে পারে এবং একবার ছাড়াও উচ্চতর নির্ভুলতা

অনেক এফপিইউ এমন একটি মোডে স্যুইচ করা যেতে পারে যেখানে তারা ডেনারমালাইজড নম্বরগুলি ফেরত না করে 0 দিয়ে প্রতিস্থাপন করে that মোডে, যদি ক এবং বি যদি ক্ষুদ্রতর নরমালাইজড সংখ্যার হয় তবে পার্থক্যটি সর্বনিম্ন নর্মালাইজড সংখ্যার চেয়ে ছোট তবে 0 এর চেয়ে বড় হয় ! = বি এছাড়াও একটি == খ গ্যারান্টি দেয় না।

"কখনও ভাসমান-পয়েন্ট সংখ্যাগুলির তুলনা করুন না" এটি কার্গো কাল্ট প্রোগ্রামিং। "আপনার একটি অ্যাপসিলনের প্রয়োজন" মন্ত্রটি রয়েছে এমন ব্যক্তির মধ্যে, বেশিরভাগেরই ধারণা নেই যে কীভাবে এই অ্যাপসিলনটি সঠিকভাবে চয়ন করবেন।


2

আমি এমন একটি ক্ষেত্রে ভাবতে পারি যেখানে আপনি এটি ঘটতে সক্ষম হতে পারেন। এখানে বেস 10-তে একটি সাদৃশ্যপূর্ণ নমুনা রয়েছে - সত্যই, এটি অবশ্যই বেস 2 তে হবে।

ভাসমান পয়েন্ট সংখ্যাগুলি কম বেশি বৈজ্ঞানিক স্বরলিপিতে সংরক্ষণ করা হয় - এটি হ'ল 35.2 দেখার পরিবর্তে, সংরক্ষণ করা সংখ্যাটি 3.52e2 এর মতো হবে।

সুবিধার জন্য কল্পনা করুন যে আমাদের কাছে একটি ভাসমান পয়েন্ট ইউনিট রয়েছে যা বেস 10 তে কাজ করে এবং যথাযথতার 3 ডিজিট রয়েছে। আপনি যখন 10.0 থেকে 9.99 বিয়োগ করবেন তখন কী হবে?

1.00e2-9.99e1

প্রতিটি মানকে একই ব্যয় করতে শিফট করুন

1.00e2-0.999e2

রাউন্ড 3 ডিজিট

1.00e2-1.00e2

আহ ওহ!

এটি চূড়ান্তভাবে ঘটতে পারে কিনা তা এফপিইউ ডিজাইনের উপর নির্ভর করে। যেহেতু ডাবলের জন্য নির্ধারকগুলির পরিসরটি অনেক বড়, হার্ডওয়্যারটি কোনও কোনও সময়ে অভ্যন্তরীণভাবে গোল করতে হয়, তবে উপরের ক্ষেত্রে অভ্যন্তরীণভাবে কেবলমাত্র 1 অতিরিক্ত সংখ্যার কোনও সমস্যা রোধ করবে।


1
বিয়োগের জন্য সারিবদ্ধ অপারেশনধারীদের নিবন্ধভুক্তদের এই পরিস্থিতি মোকাবেলায় অতিরিক্ত দুটি বিট, "গার্ড বিটস" বলে রাখা দরকার। যে দৃশ্যে বিয়োগটি সবচেয়ে উল্লেখযোগ্য বিট থেকে orrowণ নিয়ে আসে, সেখানে ছোট অপারেন্ডের দৈর্ঘ্য বৃহত্তর অপারেন্ডের অর্ধেক ছাড়িয়ে যেতে হবে (বোঝায় যে এটিতে কেবলমাত্র একটি অতিরিক্ত বিট থাকতে পারে) অন্যথায় ফলাফল অবশ্যই কমপক্ষে হতে হবে ছোট অপারেন্ডের অর্ধ মাত্রা (এটি বোঝায় যে এটির জন্য কেবল আরও একটি বিট প্রয়োজন হবে, সঠিক তথ্যটি নিশ্চিত করার জন্য যথেষ্ট তথ্য)।
সুপারক্যাট

1
"চূড়ান্তভাবে এটি এফপিইউ ডিজাইনের উপর নির্ভর করে কিনা" তা না, জাভা সংজ্ঞা বলে যে এটি পারে না বলে এটি ঘটতে পারে না। এফপিইউ ডিজাইনের সাথে এর কোনও সম্পর্ক নেই।
পাস্কাল কুয়াক

@ পাসলকুক: আমাকে ভুল করে থাকলে আমাকে সংশোধন করুন তবে strictfpসক্ষম না হলে গণনাগুলির পক্ষে মান খুব কম পাওয়া সম্ভব doubleতবে এটি একটি প্রসারিত-নির্ভুলতা ভাসমান-পয়েন্ট মানের সাথে মানিয়ে যাবে।
সুপারক্যাট

@ সুপেরাক্যাট অনুপস্থিতি কেবল strictfp"মধ্যবর্তী ফলাফল" এর মানগুলিকে প্রভাবিত করে এবং আমি ডকস.অরাকল . com/javase/specs/jls/se7/html/jls-15.html#jls-15.4 থেকে উদ্ধৃত করছিaএবং bহয় doubleভেরিয়েবল, না অন্তর্বর্তী ফলাফল, ফলে তাদের মান ডাবল স্পষ্টতা মান এইভাবে 2 ^ -1074 এর গুণিতক। এই দুটি ডাবল-স্পষ্টতা মানগুলির বিয়োগফলটি ফলস্বরূপ 2 ^ -1074 এর একাধিক হয়, সুতরাং বিস্তৃত এক্সপোনেন্ট পরিসীমা বৈশিষ্ট্যটি পরিবর্তন করে যে পার্থক্য 0 iff a == খ হয়।
পাস্কেল কুয়াক

@ সুপের্যাট এটি অর্থবোধ করে - এটি করার জন্য আপনার কেবল একটি অতিরিক্ত বিট প্রয়োজন।
Keldor314

1

সমতার জন্য আপনার কখনও ভাসমান বা দ্বৈত তুলনা করা উচিত নয়; কারণ, আপনি সত্যিই গ্যারান্টি দিতে পারবেন না যে আপনি ভাসা বা ডাবলকে নির্ধারিত সংখ্যাটি সঠিক exact

বুদ্ধিমানভাবে সমতার জন্য ভাসমানগুলির তুলনা করতে আপনাকে মানটি একই মানের সাথে "যথেষ্ট পরিমাণে" কিনা তা পরীক্ষা করে দেখতে হবে:

if ((first >= second - error) || (first <= second + error)

6
"কখনই উচিত নয়" কিছুটা শক্তিশালী তবে সাধারণত এটি ভাল পরামর্শ।
মার্ক প্যাটিসন

1
যদিও আপনি সত্য, abs(first - second) < error(বা <= error) সহজ এবং আরও সংক্ষিপ্ত।
glglgl

3
যদিও বেশিরভাগ ক্ষেত্রে সত্য ( সমস্ত নয় ) সত্যই প্রশ্নের উত্তর দেয় না।
সহস্রাব্দ

4
সমতার জন্য ভাসমান-পয়েন্ট সংখ্যাগুলি পরীক্ষা করা প্রায়শই দরকারী। কোনও এপসিলনের সাথে তুলনা করার মতো বুদ্ধিমান কিছুই নেই যা সাবধানতার সাথে বেছে নেওয়া হয়নি এবং যখন কেউ সমতার জন্য পরীক্ষা করছেন তখন কোনও অ্যাপসিলনের সাথে তুলনা করার বিষয়ে কম বুদ্ধিমান।
tmyklebu

1
আপনি যদি কোনও ভাসমান-পয়েন্ট কীতে একটি অ্যারে বাছাই করেন তবে আমি গ্যারান্টি দিতে পারি যে আপনি যদি কোনও এপসিলনের সাথে ভাসমান-পয়েন্ট সংখ্যার তুলনা করার কৌশলগুলি ব্যবহার করার চেষ্টা করেন তবে আপনার কোডটি কাজ করবে না। কারণ যে গ্যারান্টিটি যে a == বি এবং বি == সি বোঝায় সেখানে একটি == গ আর নেই। হ্যাশ টেবিলের জন্য, ঠিক একই সমস্যা। যখন সাম্যতা ট্রানজিটিভ হয় না, তখন আপনার অ্যালগোরিদমগুলি কেবল ভেঙে যায়।
gnasher729

1

শূন্য দ্বারা বিভাজন অপরিজ্ঞাত, যেহেতু ধনাত্মক সংখ্যা থেকে সীমা অসীমের দিকে ঝুঁকছে, negativeণাত্মক সংখ্যা থেকে সীমাবদ্ধতা নেতিবাচক অসীমের দিকে ঝোঁক।

কোনও ভাষা ট্যাগ না থাকায় এটি সি ++ বা জাভা কিনা তা নিশ্চিত নন।

double calculation(double a, double b)
{
     if (a == b)
     {
         return nan(""); // C++

         return Double.NaN; // Java
     }
     else
     {
         return 2 / (a - b);
     }
}

1

মূল সমস্যাটি হ'ল কম্পিউটারের একটি ডাবল প্রতিনিধিত্ব (অরফ ফ্লোট, বা গাণিতিক ভাষায় আসল সংখ্যা) যখন আপনার "খুব বেশি" দশমিক থাকে, উদাহরণস্বরূপ আপনি যখন দ্বিগুণ হন তখন একটি সংখ্যার মান হিসাবে লেখা যায় না ( পাই বা 1/3 এর ফলাফল)।

সুতরাং a == b কে a এবং b এর দ্বিগুণ মান দিয়ে সম্পন্ন করা যায় না, যখন a = 0.333 এবং b = 1/3 এর সাথে আপনি কীভাবে একটি == বি ব্যবহার করবেন? আপনার ওএস বনাম এফপিইউ বনাম সংখ্যা বনাম ভাষা বনাম 0 এর পরে 3 এর গণনা অনুসারে আপনার সত্য বা মিথ্যা হবে।

যাইহোক আপনি যদি কম্পিউটারে "ডাবল মান গণনা" করেন তবে আপনাকে নির্ভুলতার সাথে মোকাবিলা করতে হবে, তাই না করে বরং আপনাকেই a==bকরতে হবে absolute_value(a-b)<epsilon, এবং এপিসিলন আপনার অ্যালগরিদমের সেই সময়ে আপনি কী মডেলিং করছেন তার সাথে সম্পর্কিত। আপনার সমস্ত দ্বিগুণ তুলনার জন্য আপনার কাছে অ্যাপসিলন মান থাকতে পারে না।

সংক্ষেপে, আপনি যখন একটি == বি টাইপ করেন, তখন আপনার গাণিতিক এক্সপ্রেশন থাকে যা কোনও কম্পিউটারে অনুবাদ করা যায় না (কোনও ভাসমান পয়েন্ট সংখ্যার জন্য)।

পিএস: হুম, আমি এখানে যে সমস্ত উত্তর দেই তা অন্যের প্রতিক্রিয়া এবং মন্তব্যে কম বেশি কম।


1

@ ম্যালারেসের প্রতিক্রিয়া এবং @ টেমির মন্তব্যের ভিত্তিতে, এখানে আমার সামান্য অবদান:

public double calculation(double a, double b)
{
     double c = 2 / (a - b);

     // Should not have a big cost.
     if (isnan(c) || isinf(c))
     {
         return 0; // A 'whatever' value.
     }
     else
     {
         return c;
     }
}

আমার বক্তব্যটি হ'ল: বিভাগের ফলাফল ন্যান বা ইনফ রয়েছে কিনা তা জানার সহজ উপায় বিভাগটি সম্পাদন করার ক্ষেত্রে সত্য।

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