मेरे पास एक कार्यक्रम है जो doubleएक वांछित संख्या के लिए एक नीचे हटना करने की कोशिश करता है । मुझे जो आउटपुट मिलता हैNaN ।
NaNजावा में क्या मतलब है?
मेरे पास एक कार्यक्रम है जो doubleएक वांछित संख्या के लिए एक नीचे हटना करने की कोशिश करता है । मुझे जो आउटपुट मिलता हैNaN ।
NaNजावा में क्या मतलब है?
जवाबों:
इस पृष्ठ से लिया गया :
"NaN" का अर्थ "एक संख्या नहीं" है। "नेन" का उत्पादन किया जाता है यदि फ्लोटिंग पॉइंट ऑपरेशन में कुछ इनपुट पैरामीटर होते हैं जो ऑपरेशन को कुछ अपरिभाषित परिणाम उत्पन्न करने का कारण बनाते हैं। उदाहरण के लिए, 0.0 से विभाजित 0.0 अंकगणितीय रूप से अपरिभाषित है। ऋणात्मक संख्या का वर्गमूल लेना भी अपरिभाषित है।
NaNकेवल "संख्या" होने की दिलचस्प संपत्ति है जो कि तुलना करते समय खुद के समान नहीं है। इसलिए एक आम (और कई भाषाओं में केवल) परीक्षण एक संख्या है, तो xहै NaN: निम्नलिखित हैboolean isNaN(x){return x != x;}
iऔर कुछ भाषाएँ जैसे अजगर इसके साथ बहुत अच्छी तरह से पेश आते हैं ... हो सकता है कि आप में ऐसा न javaहो
NaNका अर्थ है "नंबर नहीं" और मूल रूप से एक विशेष फ्लोटिंग पॉइंट वैल्यू का प्रतिनिधित्व है IEE 754 फ्लोटिंग पॉइंट मानक । NaN का आम तौर पर मतलब है कि मूल्य एक ऐसी चीज है जिसे मान्य फ्लोटिंग पॉइंट संख्या के साथ व्यक्त नहीं किया जा सकता है।
एक रूपांतरण इस मूल्य में परिणाम देगा, जब परिवर्तित किया जा रहा मूल्य कुछ और है, उदाहरण के लिए जब एक स्ट्रिंग को परिवर्तित करना जो एक संख्या का प्रतिनिधित्व नहीं करता है।
parseFloat()या parseDouble? या कुछ और?
NaNका अर्थ है "नॉट ए नम्बर" और यह फ्लोटिंग पॉइंट नंबरों पर अपरिभाषित परिचालनों का परिणाम है, जैसे कि शून्य को शून्य से विभाजित करना। (ध्यान दें कि गैर-शून्य संख्या को शून्य से विभाजित करते हुए भी आमतौर पर गणित में अपरिभाषित होता है, इसका परिणाम NaN में नहीं बल्कि सकारात्मक या नकारात्मक अनंत में होता है)।
NaNका अर्थ है "संख्या नहीं।" यह एक विशेष फ़्लोटिंग पॉइंट मान है जिसका अर्थ है कि एक ऑपरेशन का परिणाम वास्तविक संख्या के रूप में परिभाषित या प्रतिनिधित्व योग्य नहीं था।
इस मूल्य के अधिक विवरण के लिए यहां देखें ।
NaN का मतलब नॉट नंबर है। इसका उपयोग किसी भी मूल्य को इंगित करने के लिए किया जाता है जो गणितीय रूप से अपरिभाषित है। जैसे 0.0 को 0.0 से विभाजित करना। अधिक जानकारी के लिए आप यहां देख सकते हैं: https://web.archive.org/web/20120819091816/http://www.concentric.net/~ttwang/tech/javafloat.htm
यदि आपको अधिक सहायता की आवश्यकता हो तो अपना कार्यक्रम यहां पोस्ट करें।
NaN = संख्या नहीं।
न्यूनतम रननीय उदाहरण
पहली चीज जिसे आपको जानना है, वह यह है कि NaN की अवधारणा को सीधे CPU हार्डवेयर पर लागू किया जाता है।
सभी प्रमुख आधुनिक सीपीयू IEEE 754 का अनुसरण करते प्रतीत होते हैं जो फ्लोटिंग पॉइंट फॉरमेट को निर्दिष्ट करते हैं, और NaNs, जो कि केवल विशेष फ्लोट मान हैं, उस मानक का हिस्सा हैं।
इसलिए, अवधारणा जावा सहित किसी भी भाषा में बहुत समान होगी, जो कि सीधे सीपीयू में फ्लोटिंग पॉइंट कोड का उत्सर्जन करती है।
आगे बढ़ने से पहले, आप पहले मेरे द्वारा लिखे गए उत्तर को पढ़ सकते हैं:
अब कुछ जावा एक्शन के लिए। ब्याज के अधिकांश कार्य जो मुख्य भाषा में नहीं हैं, वे अंदर रहते हैंjava.lang.Float ।
Nan.java
import java.lang.Float;
import java.lang.Math;
public class Nan {
public static void main(String[] args) {
// Generate some NaNs.
float nan = Float.NaN;
float zero_div_zero = 0.0f / 0.0f;
float sqrt_negative = (float)Math.sqrt(-1.0);
float log_negative = (float)Math.log(-1.0);
float inf_minus_inf = Float.POSITIVE_INFINITY - Float.POSITIVE_INFINITY;
float inf_times_zero = Float.POSITIVE_INFINITY * 0.0f;
float quiet_nan1 = Float.intBitsToFloat(0x7fc00001);
float quiet_nan2 = Float.intBitsToFloat(0x7fc00002);
float signaling_nan1 = Float.intBitsToFloat(0x7fa00001);
float signaling_nan2 = Float.intBitsToFloat(0x7fa00002);
float nan_minus = -nan;
// Generate some infinities.
float positive_inf = Float.POSITIVE_INFINITY;
float negative_inf = Float.NEGATIVE_INFINITY;
float one_div_zero = 1.0f / 0.0f;
float log_zero = (float)Math.log(0.0);
// Double check that they are actually NaNs.
assert Float.isNaN(nan);
assert Float.isNaN(zero_div_zero);
assert Float.isNaN(sqrt_negative);
assert Float.isNaN(inf_minus_inf);
assert Float.isNaN(inf_times_zero);
assert Float.isNaN(quiet_nan1);
assert Float.isNaN(quiet_nan2);
assert Float.isNaN(signaling_nan1);
assert Float.isNaN(signaling_nan2);
assert Float.isNaN(nan_minus);
assert Float.isNaN(log_negative);
// Double check that they are infinities.
assert Float.isInfinite(positive_inf);
assert Float.isInfinite(negative_inf);
assert !Float.isNaN(positive_inf);
assert !Float.isNaN(negative_inf);
assert one_div_zero == positive_inf;
assert log_zero == negative_inf;
// Double check infinities.
// See what they look like.
System.out.printf("nan 0x%08x %f\n", Float.floatToRawIntBits(nan ), nan );
System.out.printf("zero_div_zero 0x%08x %f\n", Float.floatToRawIntBits(zero_div_zero ), zero_div_zero );
System.out.printf("sqrt_negative 0x%08x %f\n", Float.floatToRawIntBits(sqrt_negative ), sqrt_negative );
System.out.printf("log_negative 0x%08x %f\n", Float.floatToRawIntBits(log_negative ), log_negative );
System.out.printf("inf_minus_inf 0x%08x %f\n", Float.floatToRawIntBits(inf_minus_inf ), inf_minus_inf );
System.out.printf("inf_times_zero 0x%08x %f\n", Float.floatToRawIntBits(inf_times_zero), inf_times_zero);
System.out.printf("quiet_nan1 0x%08x %f\n", Float.floatToRawIntBits(quiet_nan1 ), quiet_nan1 );
System.out.printf("quiet_nan2 0x%08x %f\n", Float.floatToRawIntBits(quiet_nan2 ), quiet_nan2 );
System.out.printf("signaling_nan1 0x%08x %f\n", Float.floatToRawIntBits(signaling_nan1), signaling_nan1);
System.out.printf("signaling_nan2 0x%08x %f\n", Float.floatToRawIntBits(signaling_nan2), signaling_nan2);
System.out.printf("nan_minus 0x%08x %f\n", Float.floatToRawIntBits(nan_minus ), nan_minus );
System.out.printf("positive_inf 0x%08x %f\n", Float.floatToRawIntBits(positive_inf ), positive_inf );
System.out.printf("negative_inf 0x%08x %f\n", Float.floatToRawIntBits(negative_inf ), negative_inf );
System.out.printf("one_div_zero 0x%08x %f\n", Float.floatToRawIntBits(one_div_zero ), one_div_zero );
System.out.printf("log_zero 0x%08x %f\n", Float.floatToRawIntBits(log_zero ), log_zero );
// NaN comparisons always fail.
// Therefore, all tests that we will do afterwards will be just isNaN.
assert !(1.0f < nan);
assert !(1.0f == nan);
assert !(1.0f > nan);
assert !(nan == nan);
// NaN propagate through most operations.
assert Float.isNaN(nan + 1.0f);
assert Float.isNaN(1.0f + nan);
assert Float.isNaN(nan + nan);
assert Float.isNaN(nan / 1.0f);
assert Float.isNaN(1.0f / nan);
assert Float.isNaN((float)Math.sqrt((double)nan));
}
}
साथ दौड़ो:
javac Nan.java && java -ea Nan
आउटपुट:
nan 0x7fc00000 NaN
zero_div_zero 0x7fc00000 NaN
sqrt_negative 0xffc00000 NaN
log_negative 0xffc00000 NaN
inf_minus_inf 0x7fc00000 NaN
inf_times_zero 0x7fc00000 NaN
quiet_nan1 0x7fc00001 NaN
quiet_nan2 0x7fc00002 NaN
signaling_nan1 0x7fa00001 NaN
signaling_nan2 0x7fa00002 NaN
nan_minus 0xffc00000 NaN
positive_inf 0x7f800000 Infinity
negative_inf 0xff800000 -Infinity
one_div_zero 0x7f800000 Infinity
log_zero 0xff800000 -Infinity
तो इससे हम कुछ चीजें सीखते हैं:
अजीब अस्थायी संचालन जो कोई समझदार परिणाम नहीं देते हैं NaN:
0.0f / 0.0fsqrt(-1.0f)log(-1.0f)उत्पन्न करें NaN।
सी में, ऐसे ऑपरेशनों पर संकेतों का अनुरोध करने के लिए वास्तव में feenableexceptउन्हें पता लगाने के लिए अनुरोध करना संभव है , लेकिन मुझे नहीं लगता कि यह जावा में उजागर हुआ है: क्यों शून्य 1 पर पूर्णांक विभाजन त्रुटि देता है लेकिन फ्लोटिंग पॉइंट 1 / 0.0 "Inf" देता है?
अजीब ऑपरेशन जो कि प्लस या माइनस इनफिनिटी की सीमा पर हैं, लेकिन NaN के बजाय + - इन्फिनिटी देते हैं
1.0f / 0.0flog(0.0f)0.0 लगभग इस श्रेणी में आता है, लेकिन संभावना है कि समस्या या तो प्लस या माइनस इन्फिनिटी तक जा सकती है, इसलिए इसे NaN के रूप में छोड़ दिया गया।
अगर NaN फ्लोटिंग ऑपरेशन का इनपुट है, तो आउटपुट NaN भी हो जाता है
वहाँ NaN के लिए कई संभावित मान हैं 0x7fc00000, 0x7fc00001, 0x7fc00002, x86_64 केवल उत्पन्न करने के लिए लगता है, हालांकि 0x7fc00000।
NaN और अनंत में बाइनरी प्रतिनिधित्व समान है।
चलो उनमें से कुछ को तोड़ते हैं:
nan = 0x7fc00000 = 0 11111111 10000000000000000000000
positive_inf = 0x7f800000 = 0 11111111 00000000000000000000000
negative_inf = 0xff800000 = 1 11111111 00000000000000000000000
| | |
| | mantissa
| exponent
|
sign
इससे हम पुष्टि करते हैं कि IEEE754 क्या निर्दिष्ट करता है:
NaNs सकारात्मक या नकारात्मक (शीर्ष बिट) हो सकते हैं, हालांकि इसका सामान्य संचालन पर कोई प्रभाव नहीं पड़ता है
Ubuntu 18.10 amd64, OpenJDK 1.8.0_191 में परीक्षण किया गया।
जावा लड़का नहीं है, लेकिन जेएस और अन्य भाषाओं में मैं इसका उपयोग "नॉट नम्बर" कर रहा हूं, जिसका अर्थ है कि कुछ ऑपरेशनों के कारण यह वैध संख्या नहीं बन पाई।
इसका शाब्दिक अर्थ है "नॉट अ नम्बर।" मुझे संदेह है कि आपकी रूपांतरण प्रक्रिया में कुछ गड़बड़ है।
इस संदर्भ में नॉट ए नंबर सेक्शन देखें
मान्य फ़्लोटिंग-पॉइंट वैल्यू नहीं है (उदाहरण शून्य द्वारा विभाजन का परिणाम)