জাভাতে, এনএএন মানে কী?


107

আমার একটি প্রোগ্রাম রয়েছে যা একটি doubleনিচে একটি পছন্দসই সংখ্যায় সঙ্কুচিত করার চেষ্টা করে । আউটপুট আমি পাই NaN

NaNজাভা মানে কি ?


জাভাতে NaN ব্যবহার করার সময় NaN এবং সাধারণ সমস্যাগুলির
ফিল

আপনি যদি জিজ্ঞাসা করছেন "এনএন কী ভাল?" জাভাতে (বা অন্য কোনও ভাষায়), আমি আপনাকে ব্যবহারের ক্ষেত্রে এটি দিতে পারি যেখানে এটি খুব সহজ: আমি "NaN" দিয়ে সেই মানটি পূরণ করব। এটি আমার গণনার ডাউনস্ট্রিম ব্যবহারকারীদের সিগন্যাল করতে ব্যবহার করা যেতে পারে (যেমন যখন এটি কোনও রাস্টার চিত্রে পরিণত হয়) "এই মুহুর্তে মানটির দিকে মনোযোগ দিন না"। খুব দরকারী!
ড্যান এইচ

বিটিডাব্লু, কী - ঠিক - এর অর্থ কী "সঙ্কুচিত" একটি ডাবল? কৌতূহলী ...
ড্যান এইচ

উত্তর:


153

এই পৃষ্ঠা থেকে নেওয়া :

"NaN" এর অর্থ "সংখ্যা নয়"। "ন্যান" উত্পাদিত হয় যদি কোনও ফ্লোটিং পয়েন্ট অপারেশনে কিছু ইনপুট প্যারামিটার থাকে যা অপারেশনটিকে কিছু অপরিজ্ঞাত ফলাফল দেয়। উদাহরণস্বরূপ, 0.0 দ্বারা বিভক্ত 0.0 গণিতগতভাবে অপরিজ্ঞাত ined Aণাত্মক সংখ্যার বর্গমূল গ্রহণ করাও অপরিজ্ঞাত।


16
অতিরিক্তভাবে, NaN আইআইইই স্ট্যান্ডার্ড ফর ফ্লোটিং-পয়েন্ট অ্যারিমেটিক (আইইইই 754) দ্বারা সংজ্ঞায়িত করা হয়েছে যা জাভা অন্ধভাবে অনুসরণ করে। স্ট্যান্ডার্ড পড়া আপনার চোখকে অনেক কিছুই খোলে, শূন্যের একাধিক মান একটি জিনিস being
এস্কো

37
এছাড়াও, NaNএকমাত্র "সংখ্যা" হওয়ার আকর্ষণীয় সম্পত্তি রয়েছে যা তুলনা করার সময় নিজের মতো হয় না। অতএব একটি সাধারণ (এবং বিভিন্ন ভাষায় শুধুমাত্র) পরীক্ষা একটি সংখ্যা যদি xহয় NaN: নিম্নোক্তboolean isNaN(x){return x != x;}
quazgar

3
উত্তরের লিঙ্ক মারা গেছে?
পাং

3
... "negativeণাত্মক সংখ্যার বর্গমূল গ্রহণ অনির্ধারিত (গাণিতিক ক্ষেত্রে)" ... এটি নয়! তার আসলে iএবং পাইথন চুক্তি মত কিছু কিছু ভাষায় খুব ভাল এটা দিয়ে ... এটা না মামলা হতে পারে javaতুমি
রাফায়েল টি

5
@ রাফেলটি আমি বলব এটি জটিল-অংক সংক্রান্ত গাণিতিক ক্ষেত্রে সংজ্ঞায়িত। জাভাতে একটি ফ্লোট বা ডাবলকে জটিল নম্বর নির্ধারণের কোনও উপায় নেই। পাইথনটি ডায়নামিকভাবে টাইপ করা হয়, সুতরাং এই ক্ষেত্রে সম্ভবত একটি জটিল সংখ্যা ফেরত পাওয়া সম্ভব।
এসএসটিএন ২

19

NaNমানে "একটি সংখ্যা নয়" এবং এটি মূলত আইইই 754 ফ্লোটিং পয়েন্ট স্ট্যান্ডার্ডে একটি বিশেষ ভাসমান পয়েন্ট মানের উপস্থাপনা। NaN এর অর্থ সাধারণত যে মানটি এমন একটি যা বৈধ ভাসমান পয়েন্ট সংখ্যা দিয়ে প্রকাশ করা যায় না।

রূপান্তরকরণের ফলে এই মানটির ফলাফল হয়, যখন রূপান্তরিত হওয়া মানটি অন্য কিছু হয়, উদাহরণস্বরূপ কোনও সংখ্যাকে প্রতিনিধিত্ব করে না এমন স্ট্রিং রূপান্তর করার সময়।


রূপান্তর কিভাবে? সাথে parseFloat()বা parseDouble? অথবা অন্য কিছু?
অ্যালোনসো ডেল আর্টে 19:16

14

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


5

NaNঅর্থ "সংখ্যা নয়" " এটি একটি বিশেষ ভাসমান পয়েন্টের মান যার অর্থ একটি অপারেশনের ফলাফল সংজ্ঞাযুক্ত বা সত্যিকারের সংখ্যা হিসাবে প্রতিনিধিত্বযোগ্য নয়।

এই মানটির আরও ব্যাখ্যার জন্য এখানে দেখুন ।


5

ন্যান মানে নট এ নাম্বার। এটি গাণিতিকভাবে অপরিজ্ঞাত যে কোনও মানকে বোঝাতে ব্যবহৃত হয়। 0.0 দ্বারা 0.0 ভাগ করে দেওয়ার মতো। আপনি আরও তথ্যের জন্য এখানে দেখতে পারেন: https://web.archive.org/web/20120819091816/http://www.concentric.net/~ttwang/tech/javafloat.htm

আপনার আরও সহায়তার প্রয়োজন হলে আপনার প্রোগ্রামটি এখানে পোস্ট করুন।



4

মানে একটি নম্বর নয়। এটি অনেক প্রোগ্রামিং ভাষায় একটি অসম্ভব সংখ্যাসূচক মানের জন্য একটি সাধারণ প্রতিনিধিত্ব।


4

ন্যূনতম চলমান উদাহরণ

আপনার প্রথম জিনিসটি যা জানতে হবে তা হ'ল NaN এর ধারণাটি সরাসরি সিপিইউ হার্ডওয়ারে প্রয়োগ করা হয়।

সমস্ত বড় আধুনিক সিপিইউ আইইইই 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.0f
    • sqrt(-1.0f)
    • log(-1.0f)

    উত্পন্ন a NaN

    সি-তে feenableexcept, সনাক্তকরণের সাথে এই জাতীয় ক্রিয়াকলাপগুলিতে সংকেত উত্থাপনের অনুরোধ করা আসলেই সম্ভব , তবে আমি মনে করি না যে এটি জাভাতে প্রকাশিত হয়েছে: কেন শূন্য 1/0 দ্বারা পূর্ণসংখ্যা বিভাগ ত্রুটি দেয় তবে ভাসমান পয়েন্ট 1 / 0.0 দেয়? "ইনফ" ফিরিয়ে দেয়?

  • অদ্ভুত ক্রিয়াকলাপগুলি যা প্লাস বা বিয়োগ অনন্তের সীমাতে রয়েছে তবে NaN এর পরিবর্তে + - অনন্ত দেয়

    • 1.0f / 0.0f
    • log(0.0f)

    0.0 প্রায় এই বিভাগে পড়ে তবে সম্ভবত সমস্যাটি হ'ল এটি হয় প্লাস বা মাইনাস ইনফিনিটিতে যেতে পারে, সুতরাং এটি এনএএন হিসাবে রেখে দেওয়া হয়েছিল।

  • যদি NaN একটি ভাসমান অপারেশনের ইনপুট হয় তবে আউটপুটটিও NaN থাকে

  • সেখানে NaN জন্য বিভিন্ন সম্ভাব্য মান 0x7fc00000, 0x7fc00001, 0x7fc00002,, x86_64 শুধুমাত্র উৎপন্ন বলে মনে হয় যদিও 0x7fc00000

  • এনএএন এবং অনন্তের বাইনারি প্রতিনিধিত্ব রয়েছে।

    আসুন তাদের কয়েকটি ভাঙ্গা যাক:

    nan          = 0x7fc00000 = 0 11111111 10000000000000000000000
    positive_inf = 0x7f800000 = 0 11111111 00000000000000000000000
    negative_inf = 0xff800000 = 1 11111111 00000000000000000000000
                                | |        |
                                | |        mantissa
                                | exponent
                                |
                                sign

    এটি থেকে আমরা নিশ্চিত করি যে আইইইই specif75৫ নির্দিষ্ট করে:

    • এনএএন এবং ইনফিনিটিস উভয়েরই সূচক রয়েছে == 255 (সমস্ত)
    • অসম্পূর্ণতাগুলির ম্যান্টিসা রয়েছে == ০. সুতরাং কেবলমাত্র দু'টি অসম্পূর্ণতা রয়েছে: + এবং -, সাইন বিটের দ্বারা পৃথক
    • NaN এর ম্যান্টিসা আছে! = 0. তাই ম্যান্টিসা == 0 বাদে বেশ কয়েকটি সম্ভাবনা রয়েছে যা অনন্ত
  • এনএএনগুলি হয় ধনাত্মক বা নেতিবাচক (টপ বিট) হতে পারে, যদিও এটির স্বাভাবিক ক্রিয়াকলাপগুলিতে এর কোনও প্রভাব নেই

উবুন্টু 18.10 amd64, ওপেনজেডিকে 1.8.0_191 এ পরীক্ষিত।


3

জাভা লোক নয়, তবে জেএস এবং অন্যান্য ভাষায় আমি এটি "নট এ নাম্বার" ব্যবহার করি না, যার অর্থ কোনও ক্রিয়াকলাপই এটি একটি বৈধ সংখ্যা নয়।



3

বৈধ ভাসমান-পয়েন্ট মান নয় (উদাহরণস্বরূপ শূন্য দ্বারা বিভাগের ফলাফল)

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


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

"বৈধ মান" এবং "নির্দিষ্ট সংজ্ঞায়িত" একই জিনিস নয়। 0/0 তে সম্মত
ভ্লাদিমির দিউজেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.