Double.NaN == Double.NaN মিথ্যা ফিরে আসে কেন?


155

আমি কেবল ওসিপিজেপি প্রশ্নগুলি অধ্যয়ন করছিলাম এবং আমি এই অদ্ভুত কোডটি পেয়েছি:

public static void main(String a[]) {
    System.out.println(Double.NaN==Double.NaN);
    System.out.println(Double.NaN!=Double.NaN);
}

আমি কোডটি চালানোর সময়, আমি পেয়েছিলাম:

false
true

falseএকে অপরের মতো দেখতে দুটি জিনিস তুলনা করার সময় আউটপুটটি কেমন হয় ? কী NaNমানে?


8
এটা সত্যিই অদ্ভুত। Double.NaN স্থির চূড়ান্ত হওয়ার কারণে, == এর সাথে তুলনাটি সত্য হওয়া উচিত। প্রশ্নের জন্য +1।
স্টেফান

2
অজগর ক্ষেত্রেও একই কথা:In [1]: NaN==NaN Out[1]: False
tdc

58
আইইইই 754 স্ট্যান্ডার্ডটি সঠিকভাবে অনুসরণ করে এমন সমস্ত ভাষায় একই।
zzzzBov

4
অন্তর্দৃষ্টি: "হ্যালো" একটি সংখ্যা নয়, সত্য (বুলিয়ান) এছাড়াও একটি সংখ্যা নয়। NaN! = একই কারণে "হ্যালো"!
কেভিন

3
@ স্টেফান: তুলনাটি টাইপ Double.NaN==Double.NaNহলে সত্যই ফিরে পাওয়া উচিত । তবে, এর ধরণটি আদিম , এবং অপারেটর প্রয়োগের নিয়মকানুন (যা উত্তরগুলিতে বর্ণিত হিসাবে আইইইই 754 এর সাথে সামঞ্জস্য করার জন্য এই অসমতার দাবি করে)। Double.NaNjava.lang.Doubledoubledouble
sleske

উত্তর:


139

NaN এর অর্থ "একটি সংখ্যা নয়"।

জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন (জেএলএস) তৃতীয় সংস্করণ বলে :

ওভারফ্লোস এমন একটি অপারেশন যা একটি স্বাক্ষরিত অনন্ত উত্পাদন করে, একটি অপারেশন যা আন্ডারফ্লোস একটি অস্বীকৃত মান বা একটি স্বাক্ষরিত শূন্য উত্পাদন করে এবং কোনও অপারেশন যার গাণিতিকভাবে নির্দিষ্ট ফলাফল না থেকে এনএন তৈরি হয়। অপারেন্ড হিসাবে NaN সহ সমস্ত সংখ্যক ক্রিয়াকলাপ ফলস্বরূপ NaN উত্পাদন করে। যেমনটি ইতিমধ্যে বর্ণিত হয়েছে, এনএএন আনর্ডারড নয়, সুতরাং এক বা দুটি ন্যাশনাল রিটার্ন জড়িত এমন একটি সংখ্যাসূচক তুলনা অপারেশন falseএবং এনএএন কখন রয়েছে তা সহ এনএনএন রিটার্ন !=জড়িত কোনও তুলনা ।truex!=xx


4
@নিবোট: বেশিরভাগ ক্ষেত্রেই সত্য । কোনও আইইইই-কনফর্মিং ফ্লোটের সাথে কোনও তুলনা উত্পাদন করবে false। আইইইই দাবি করে যে মান জাভা থেকে পৃথক (NAN != NAN) == false
ড্রয় ডোরম্যান

2
এই পান্ডোরার বাক্সটি খোলার - আপনি কোথায় দেখতে পাচ্ছেন যে "আইইইই দাবি করে (ন্যান! = এনএন) == মিথ্যা"?
সুপারভাইজার

62

NaN সংজ্ঞা অনুসারে NaN সহ কোনও সংখ্যার সমান নয়। এটি আইইইই 754 স্ট্যান্ডার্ডের একটি অংশ এবং সিপিইউ / এফপিইউ দ্বারা প্রয়োগ করা। জেভিএম সমর্থন করার জন্য কোনও যুক্তি যুক্ত করার মতো বিষয় নয়।

http://en.wikipedia.org/wiki/NaN

নিজের সাথে তুলনা করার পরেও কোনও এনএএন এর সাথে তুলনা সর্বদা একটি অযৌক্তিক ফলাফল দেয়। ... সমতা এবং বৈষম্যের পূর্বাভাসগুলি অ সংকেতযুক্ত তাই x = x প্রত্যাবর্তন মিথ্যা যদি এক্স একটি শান্ত এনএন হয় তা পরীক্ষার জন্য ব্যবহার করা যেতে পারে।

জাভা সমস্ত NaN কে শান্ত NaN হিসাবে বিবেচনা করে।


1
এটি কি সিপিইউ দ্বারা বাস্তবায়ন করা হয়েছে, বা বোহেমিয়ান যেমন উল্লেখ করেছেন তেমন এটি JVM- এ শক্ত-ওয়্যার্ড?
নাভিদ চৌগল

3
জেভিএমকে কল করতে হবে যা কিছু এটি কার্যকরভাবে প্রয়োগ করবে। একটি পিসিতে, সিপিইউ সমস্ত কাজ যেমন করে। এই সমর্থন ব্যতীত একটি মেশিনে জেভিএমকে এটি প্রয়োগ করতে হবে। (আমি এই জাতীয় কোনও মেশিন সম্পর্কে জানি না)
পিটার লরে

সেদিন ফিরে যখন 8087 বিকল্প ছিল, সি লাইব্রেরিতে একটি এফপি এমুলেটর ছিল। জেভিএমের মতো প্রোগ্রামগুলিকে এটি নিয়ে কোনওভাবেই চিন্তা করতে হবে না।
লার্নের মারকুইস

49

কেন যে যুক্তি

NaNমানে Not a Number। সংখ্যা কী নয়? কিছু. আপনার একদিকে কিছু থাকতে পারে এবং অন্যদিকে কিছু থাকতে পারে, তাই কোনও কিছুই গ্যারান্টি দেয় না যে উভয়ই সমান। NaNএর সাথে গণনা করা হয় Double.longBitsToDouble(0x7ff8000000000000L)এবং আপনি যেমন নথিতে দেখতে পারেন longBitsToDouble:

যুক্তি সীমার মধ্যে কোনো মান থাকে তবে 0x7ff0000000000001Lমাধ্যমে 0x7fffffffffffffffLবা ব্যাপ্তির মধ্যে 0xfff0000000000001Lদিয়ে 0xffffffffffffffffL, ফলে একটি হল NaN

এছাড়াও, NaNযুক্তিযুক্তভাবে এপিআই এর ভিতরে চিকিত্সা করা হয়।


নথিপত্র

/** 
 * A constant holding a Not-a-Number (NaN) value of type
 * {@code double}. It is equivalent to the value returned by
 * {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
 */
public static final double NaN = 0.0d / 0.0;

উপায় দ্বারা, NaN হয় আপনার কোড নমুনা হিসাবে পরীক্ষিত:

/**
 * Returns {@code true} if the specified number is a
 * Not-a-Number (NaN) value, {@code false} otherwise.
 *
 * @param   v   the value to be tested.
 * @return  {@code true} if the value of the argument is NaN;
 *          {@code false} otherwise.
 */
static public boolean isNaN(double v) {
    return (v != v);
}

সমাধান

ব্যবহার কি আপনি কি করতে পারেন compare/ compareTo:

Double.NaNএই পদ্ধতিটিকে নিজের সমতুল্য এবং অন্যান্য সমস্ত doubleমানের (সহ Double.POSITIVE_INFINITY) এর চেয়ে বড় হিসাবে বিবেচনা করা হয় ।

Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);

বা equals,:

যদি thisএবং argumentউভয়ই উপস্থাপন করে Double.NaNতবে মানটি থাকা সত্ত্বেও equalsপদ্ধতিটি ফিরে আসে ।trueDouble.NaN==Double.NaNfalse

Double.NaN.equals(Double.NaN);

আপনি কি এমন কোনও ক্ষেত্রে জানেন যেখানে NaN != NaNমিথ্যা বলে প্রোগ্রামগুলি NaN != NaNসত্য হওয়ার চেয়ে জটিল করে তোলে ? আমি জানি আইইইইই বহু বছর আগে সিদ্ধান্ত নিয়েছিল, কিন্তু ব্যবহারিক দৃষ্টিকোণ থেকে, আমি এরকম দরকারী ক্ষেত্রে দেখিনি। যদি ক্রমান্বয়ে পুনরাবৃত্তি একই ফলাফল না পাওয়া পর্যন্ত কোনও অপারেশন চলার কথা, তবে পরপর দু'বার পুনরাবৃত্তি হওয়ার ফলে NaN "স্বাভাবিকভাবেই" ধরা পড়বে এটি যদি এই আচরণের জন্য না হয় তবে এটি একটি প্রস্থান শর্ত হিসাবে চিহ্নিত হয়েছিল।
সুপারক্যাট

@ সুপের্যাট আপনি কীভাবে বলতে পারেন যে দুটি এলোমেলো নন সংখ্যা স্বাভাবিকভাবে সমান? নাকি বলে আদিম সমান? এনএএন-কে একটি উদাহরণ হিসাবে ভাবেন, আদিম কিছু নয়। প্রতিটি ভিন্ন অস্বাভাবিক ফলাফল হ'ল অদ্ভুত কিছুর একটি ভিন্ন উদাহরণ এবং এমনকি উভয়ই একইরকম উপস্থাপন করা উচিত, বিভিন্ন দৃষ্টান্তের জন্য == ব্যবহার করে অবশ্যই মিথ্যা প্রত্যাবর্তন করতে হবে। অন্যদিকে, সমান ব্যবহার করার সময় এটি আপনি যেমন ইচ্ছা তেমন পরিচালনা করতে পারেন। [ docs.oracle.com/javase/7/docs/api/java/lang/…
falsarella

@ ফালসারেলা: দুটি এলোমেলো সংখ্যাকে "অবশ্যই সমান" হিসাবে বিবেচনা করা উচিত কিনা বিষয়টি নয়, বরং কোন ক্ষেত্রে কোনও সংখ্যাকে নিজের সাথে "স্পষ্টতই অসম" হিসাবে তুলনা করা কার্যকর? যদি কেউ এর সীমাটি গণনা করার চেষ্টা করছে f(f(f...f(x)))এবং এর মধ্যে এমন y=f[n](x)কেউ কেউ nএর ফলাফল খুঁজে f(y)পাচ্ছে না যার ফলে ফলাফলটি অবিচ্ছেদ্য y, তবে yআরও গভীর-বাসাযুক্তের ফলাফল থেকে পৃথক হয়ে উঠবে f(f(f(...f(y)))। এমনকি যদি কেউ NaN==NaNমিথ্যা হতে চায় , তবে Nan!=Nan এটিও মিথ্যা হওয়া x!=xকিছু এক্সের ক্ষেত্রে সত্য হওয়ার চেয়ে "বিস্ময়কর" হতে পারে।
সুপারক্যাট

1
@falsarella: আমি বিশ্বাস করি ধরণ Double.NaNনয় Double, কিন্তু double, তাই প্রশ্ন আচরণ এর সাথে সম্পর্কিত এক double। যদিও doubleমূল্যবোধের সাথে জড়িত সমতার সম্পর্কের জন্য পরীক্ষা করতে পারে এমন ফাংশন রয়েছে , তবে "কেন" (যা মূল প্রশ্নের অংশ) এর জন্য আমার জানা একমাত্র বাধ্যতামূলক উত্তর "কারণ আইইইই-র কিছু লোক সমতা-পরীক্ষার কথা ভাবেনি একটি সমতা সম্পর্ক সংজ্ঞা "। বিটিডাব্লু, কেবল আদিম-অপারেটরগুলি ব্যবহার করে পরীক্ষা করার xএবং yসমতুল্যতার জন্য কি কোনও সংক্ষিপ্ত প্রতিমা আছে ? আমার জানা সমস্ত সূত্রগুলি বরং চতুর।
সুপারক্যাট

1
সেরা এবং সহজ উত্তর। আপনাকে ধন্যবাদ
তরুণ নাগপাল

16

এটি প্রশ্নের সরাসরি উত্তর নাও হতে পারে। তবে আপনি যদি কিছু পরীক্ষা করতে চান তবে আপনার এটি Double.NaNব্যবহার করা উচিত:

double d = Double.NaN
Double.isNaN(d);

এই ফিরে আসবে true


6

ডাবল.এনএএন- এর জাভাদোক এগুলি সবই বলেছেন:

ধ্রুবক একটি ধরণের নন-এ-সংখ্যা (NaN) মান রাখে double। এটি প্রত্যাবর্তিত মানের সমান Double.longBitsToDouble(0x7ff8000000000000L)

মজার ব্যাপার হচ্ছে, জন্য উৎস Doubleসংজ্ঞায়িত NaNএইভাবে:

public static final double NaN = 0.0d / 0.0;

আপনি যে বিশেষ আচরণটি বর্ণনা করেছেন তা JVM- এ কঠোর-ওয়্যার্ড।


5
এটি কী জেভিএম-এ শক্ত ওয়্যার্ড হয়েছে, বা পিটারের উল্লেখ হিসাবে এটি সিপিইউ দ্বারা প্রয়োগ করা হয়েছে?
নাভিদ চৌগল

4

অনুযায়ী, ডাবল যথার্থ সংখ্যাগুলির জন্য ভাসমান পয়েন্ট গণিতের জন্য আইইইই স্ট্যান্ডার্ড ,

আইইইই ডাবল যথার্থ ফ্লোটিং পয়েন্ট স্ট্যান্ডার্ড উপস্থাপনার জন্য একটি bit৪ বিট শব্দ দরকার যা 0 থেকে 63 পর্যন্ত বাম থেকে ডান হিসাবে গণ্য করা যেতে পারে

এখানে চিত্র বর্ণনা লিখুন কোথায়,

S: Sign  1 bit
E: Exponent  11 bits
F: Fraction  52 bits 

যদি E=2047(সমস্ত Eহয় 1) এবং Fননজারো হয়, তবে V=NaN("সংখ্যা নয়")

যার অর্থ,

সমস্ত Eবিট যদি 1 হয়, এবং যদি কোনও শূন্য বিট থাকে Fতবে সংখ্যাটিNaN

অতএব, অন্যদের মধ্যে, নিম্নলিখিত সমস্ত নম্বর হ'ল NaN,

0 11111111 0000000000000000010000000000000000000000000000000000 = NaN
1 11111111 0000010000000000010001000000000000001000000000000000 = NaN
1 11111111 0000010000011000010001000000000000001000000000000000 = NaN

বিশেষত, আপনি পরীক্ষা করতে পারবেন না

if (x == Double.NaN) 

কোনও নির্দিষ্ট ফলাফলের সমান কিনা তা যাচাই করতে Double.NaN, কারণ সমস্ত "সংখ্যার নয়" মানগুলি পৃথক হিসাবে বিবেচিত হয়। তবে, আপনি এই Double.isNaNপদ্ধতিটি ব্যবহার করতে পারেন :

if (Double.isNaN(x)) // check whether x is "not a number"

3

NaN একটি বিশেষ মান যা "সংখ্যাটি নয়" বোঝায়; এটি নির্দিষ্ট অবৈধ পাটিগণিত ক্রিয়াকলাপগুলির ফলাফল, যেমন sqrt(-1)এবং এর (কখনও কখনও বিরক্তিকর) সম্পত্তিও রয়েছে NaN != NaN


2

কোনও সংখ্যা ক্রিয়াকলাপের ফলাফলকে প্রতিনিধিত্ব করে না যার ফলাফল একটি সংখ্যার সাথে উপস্থাপনযোগ্য নয়। সর্বাধিক বিখ্যাত অপারেশন 0/0, যার ফলাফল জানা যায়নি।

এই কারণে, NaN কোনও কিছুর সমান নয় (অন্যান্য নন-অ-মান সহ)। আরও তথ্যের জন্য, কেবল উইকিপিডিয়া পৃষ্ঠাটি দেখুন: http://en.wikedia.org/wiki/NaN


-1: এটি ফলাফল উপস্থাপন করে না0/00/0সর্বদা NaN, তবে NaN অন্যান্য ক্রিয়াকলাপের ফলাফল হতে পারে - যেমন 2+NaN: an operation that has no mathematically definite result produces NaN@ অ্যাড্রিয়ানমাইটেভের উত্তর অনুসারে
আনভিস

প্রকৃতপক্ষে, এনএএন এর অর্থ "নোট এ সংখ্যা নয়" এবং এটি এমন সমস্ত ক্রিয়াকলাপের ফলস্বরূপ যার ফলস্বরূপ একটি অনির্ধারিত বা উপস্থাপনযোগ্য মান। সর্বাধিক বিখ্যাত এবং সাধারণ অপারেশন হল 0/0, তবে স্পষ্টতই অন্যান্য প্রচুর অপারেশন রয়েছে যা একই ফলস্বরূপ। আমি সম্মত হই যে আমার উত্তরটি উন্নত হতে পারে, তবে আমি -১ এর সাথে একমত নই ... আমি কেবল পরীক্ষা করে দেখলাম যে উইকিপিডিয়া 0/0 অপারেশনটিকে কোনও এনএএন ফলাফলের সাথে অপারেশনের প্রথম উদাহরণ হিসাবে ব্যবহার করে ( en.wikedia.org/wiki/ নাএন )।
মাত্তেও

এছাড়াও, এটি জাভা উত্সে ডাবল: পাবলিক স্ট্যাটিক ফাইনাল ডাবল NaN = 0.0d / 0.0;
গিলিয়াম

1
@ মাত্তিও +0, এখন যে মিথ্যা বিবৃতিটি গেছে। এবং আমার -1 বা +1 আপনার পক্ষে একমত বা একমত হওয়ার জন্য নয়; তবে এটি -1 দিয়ে একটি মন্তব্য দেওয়া ভাল, যাতে লেখক বুঝতে পারে যে তার উত্তর কেন অপ্রয়োজনীয় বলে বিবেচিত হয় - এবং যদি তিনি চান তবে এটি পরিবর্তন করুন।
ANeves

@ গুইলুমে যদি মন্তব্যটি আমার জন্য বোঝানো হত তবে দয়া করে এটি পুনরায় লিখে দিন: আমি এটি বুঝতে পারি না।
ANeves

0

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

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