কীভাবে "যখন (আমি == আমি) করতে পারি;" একটি একক থ্রেড অ্যাপ্লিকেশন একটি অসীম লুপ হতে?


141

আমি কেবল একটি প্রশ্ন পেয়েছি যা আমি উত্তর দিতে পারি না।

মনে করুন জাভাতে আপনার এই লুপ সংজ্ঞা রয়েছে:

while (i == i) ;

লুপটি যদি অসীম লুপ না হয় এবং প্রোগ্রামটি কেবল একটি থ্রেড ব্যবহার করে তবে এর প্রকার iএবং মান কী ?i


7
হায় godশ্বরের দোহাই দিয়ে, লোকেরা কেন তাদের ভোটকে নিম্নচ্যুত করে তা মন্তব্য করার সম্মান থাকবে? এটি একটি ধাঁধা হিসাবে ট্যাগ, সমস্যা কি ???
ব্যবহারকারীর 454579

10
আমি মনে করি কিছু লোক কোনও কিছুর জন্য ডাউনভোটিং বন্ধ করতে পারে না।
ফেরানবি

1
বাহ, এর কারণ হিসাবে দুঃখিত: / আমি সত্যিই কেবল উত্তর চেয়েছিলাম, এবং আমি নিজের জন্য এটি সমাধান করতে পারিনি।
জিজ্জনস

1
@ নিকোলাই, এটি এসও এর প্রকৃতি drive ড্রাইভ বাই ডাউনভোটিং দুর্ভাগ্যক্রমে একটি বাস্তবতা এবং একটি মন্তব্য প্রয়োজনের ধারণাটি আলোচনা করা হয়েছে এবং প্রত্যাখ্যান করা হয়েছে। তবে দেখে মনে হচ্ছে "সম্প্রদায়" সর্বোপরি এই প্রশ্নের পক্ষে রয়েছে।
paxdiablo

1
এই ধরণের প্রশ্নের একটি কৌশল হ'ল লোকে নির্দিষ্ট কিছু পরিবর্তনশীল নামের ধরণ গ্রহণ করে অর্থাত আমি একটি অন্তর্নির্মিত, ডি একটি ডাবল, এস একটি স্ট্রিং বা একটি সংক্ষিপ্ত, সিএইচ একটি চর, এল একটি দীর্ঘ, খ এর জন্য বাইট বা বুলিয়ান কোন ধরণের পরামর্শ দেওয়া হয়েছে এবং এটি কী হতে পারে তা আপনাকে নিজেকে জিজ্ঞাসা করতে হবে।
পিটার লরে

উত্তর:


125
double i = Double.NaN;

Double.equals () এর জন্য API এর উত্তরটি বানান: "Double.NaN == Double.NaN এর মানটি মিথ্যা"। এটি " ভাসমান-পয়েন্টের ধরণ, ফর্ম্যাট এবং মানগুলি " এর অধীনে জাভা ভাষার বর্ণনায় উল্লেখ করা হয়েছে :

NaN, unordered তাই সংখ্যাসূচক তুলনা অপারেটরদের <, <=, >, এবং >= রিটার্ন falseযদি পারেন অথবা উভয় operands হয় NaN। সমতা অপারেটর ==আয় falseপারেন প্রতীক হলে NaN, এবং বৈষম্য অপারেটর !=আয় trueযদি হয় প্রতীক হয় NaNবিশেষ করে, x!=xহয় trueযদি এবং কেবল যদি xহয়NaN , এবং (x<y) == !(x>=y)হতে হবে falseযদি xবা yহয় NaN


1
ওহ, সুতরাং আপনি "নম্বর নয়" করতে পারেন!
ফিলিপ একবার্গ

12
এর গাণিতিকভাবে শক্ত, কেন একটি অবাস্তব সংখ্যা অন্যের সমান হবে? 5/0! = Sqrt (-4)
গর্ডন গুস্তাফসন

2
@ ক্র্যাজি জাগলড্র্রামার: হতে পারে তবে একইভাবে x == xসর্বদা সত্য হওয়া উচিত। কিছু কেন নিজের সমান নয়?
বার্ট ভ্যান হিউকেলাম

1
বার্ট: কারণ সত্যই, অজানা সর্বদা অজানা সমান হয় না। কখনও কখনও এটি দরকারী, সেই কারণেই ডাটাবেসে
ন্যূন থাকে

2
@ ইনোভাওভা: না, কোনও ডিবিতে null=nullশূন্য। NULL IS NULL1।
কনারাক

29

এর মান iতখন অবৈধ। "একটি নম্বর নয়"।

কিছু গুগল করার পরে, আমি জানতে পারি যে আপনার জাভাতে NaN (নম্বর নয়) থাকতে পারে! সুতরাং, একটি ফ্ল্যাট পয়েন্টিং নম্বর হ'ল ডেটা টাইপ এবং মান হয় এনএন। এখানে দেখুন


12
হ্যাঁ, এটা। আমার মান হ'ল জোন স্কিট।
অ্যান্ড্রু রোলিংস

আমি সাধারণত এমন লোকদের ঘৃণা করি যারা বিনা কারণে বিনষ্ট করে দেয় ... আমি প্রথম "নং নট" বলেছি কিন্তু ভাবি নি যে জাভা এটি পরিচালনা করতে পারে, যেহেতু এটি অন্য কোনও জিনিস হ্যান্ডেল করে না।
ফিলিপ একবার্গ



8

আমি নিশ্চিত নই, তবে আমি বিশ্বাস করি (i == i) মাল্টিথ্রেডেড প্রক্রিয়াতে পারমাণবিক ক্রিয়াকলাপ নয়, সুতরাং লুপটি কার্যকর করে থ্রেডে স্ট্যাক করে রাখার মানটির ধাক্কাগুলির মধ্যে যদি আমি অন্য থ্রেড দ্বারা পরিবর্তন করব তবে সেই অবস্থাটি মিথ্যা হতে


8

যেহেতু অন্যরা বলেছে এটি নাএন আমি অফিসিয়াল (জেডিকে 6) বাস্তবায়ন সম্পর্কে আগ্রহী হয়েছি Double.isNaNএবং দেখুন:

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

2

নানকে ব্যতিক্রমের সমতুল্য মনে করুন তবে একটি গণনার মধ্যে একটি যাদু মান ব্যবহার করে। যেহেতু একটি গণনা ব্যর্থ হয়েছে - যেমন একটি নেতিবাচক বর্গমূল, শূন্য ইত্যাদি দ্বারা ভাগ করা - এটি অন্য কোনও কিছুর সাথে তুলনা করার কোনও মানে হয় না। সর্বোপরি যদি শূন্য দ্বারা বিভক্ত হয় একটি নান এটি -2 এর বর্গমূলের বা -3 এর বর্গমূলের সমান?

ন্যান এমন একটি গণনা করার অনুমতি দেয় যা এমন একটি পদক্ষেপ অন্তর্ভুক্ত করে যা অতিরিক্ত ব্যতিক্রম প্রবর্তন না করে সম্পূর্ণরূপে একটি অবৈধ উত্তর প্রদান করে। উত্তরটি যাচাই করার জন্য ফ্লোট.আইএসএনএন () ও সমতুল্য হয়ে নন ন্যানডনেসের (কেবল এটিই যদি আমি ব্যাগ না করি তবেই এটি শব্দ) পরীক্ষার মান verify


3
এটিকে ব্যতিক্রম হিসাবে ভাবা আরও সহজ হবে যদি আমি আসলে জানতাম যে একটি ব্যতিক্রম :-) কি।
paxdiablo

2

আমি যোগ করতে হবে

float i = Float.NaN;

পাশাপাশি

double i = Double.NaN;

এই ধরণের প্রশ্নগুলির মধ্যে একটি সাধারণ কৌশল এটি আপনি যে অনুমান হিসাবে তৈরি করেন যে আমি একটি অন্তর্ভুক্ত in অন্যান্য সাধারণ অনুমানগুলি হ'ল স্ট্রিং, এক্স, ওয়াই একটি ডাবল, সিএইচ একটি চর, খ একটি বাইট ইত্যাদি you

অনুরূপ একটি প্রশ্ন হ'ল; এটি কখনই লুপ হয় না, 'এক্স' কী

while(x == x && x != x + 0) { }

আমার আরেকটি প্রশ্ন আমার বেশ পছন্দ; এই লুপটি একটি অসীম লুপ, এক্স এর সম্ভাব্য মানগুলি কী। (: আমি তাদের মধ্যে বারোটি গণনা করছি :)

while(x != 0 && x == -x) { }

0

আমি জানি এটি একটি জাভা প্রশ্ন, তবে অন্যান্য ভাষার জন্য প্রশ্নটি বিবেচনা করা আগ্রহজনক।

সি-তে, 'ইন' এর মতো একটি সাধারণ ধরণ 'মহাবিশ্বের শীতল হওয়ার আগে' আচরণটি প্রদর্শন করতে পারে যদি 'আমি'টিকে একটি অস্থির হিসাবে ঘোষণা করা হয় (সুতরাং সংকলক প্রতিটি পুনরাবৃত্তির জন্য দুটি' আই 'পড়তে বাধ্য হবে) এবং যদি 'আমি' আসলে স্মৃতিতে থাকি যেখানে অন্য কিছু এটি প্রভাবিত করতে পারে। তারপরে লুপটি শেষ হবে যখন একক পুনরাবৃত্তির দুটি পঠনের মধ্যে 'i' পরিবর্তন হয়েছিল। ( যুক্ত : একটি সম্ভাব্য জায়গা - একটি মাইক্রো কম্পিউটারে যেখানে 'i' আসলে একটি আই / ও পোর্টের ঠিকানায় অবস্থিত, সম্ভবত পজিশন সেন্সরের সাথে সংযুক্ত connected এটি 'আই' পয়েন্টার ভেরিয়েবল হলে আরও প্রশংসনীয় হবে) অস্থির স্মৃতিতে নির্দেশক) এবং বিবৃতিটি ছিল ' while (*i == *i);'।)

অন্যান্য উত্তরের দ্বারা প্রমাণিত হিসাবে, সি ++ এ, '==' অপারেটরটি যদি আমি একজন ব্যবহারকারী-সংজ্ঞায়িত শ্রেণীর হয় তবে ব্যবহারকারী দ্বারা সরবরাহ করা যেতে পারে, তাই যে কোনও কিছুই সম্ভব হতে পারে।

বরং এনএএন এর মতো, এসকিউএল-ভিত্তিক ভাষায়, লুপটি অসীম হবে না যদি আমার মান NULL হত; তবে, কোনও অ-নুল মান মান লুপটিকে অসীম করে তুলবে। এটি বরং জাওয়ার মতো, যেখানে কোনও সংখ্যা (এনএএন এর বিপরীতে) লুপটিকে অসীম করে তোলে।

কনস্ট্রাক্টটির কোনও ব্যবহারিক ব্যবহার হচ্ছে না দেখছি, তবে এটি একটি আকর্ষণীয় ট্রিভিয়া প্রশ্ন question


0

আমি এই সমাধানটি না দেখে অবাক হয়েছি:

while (sin(x) == sin(x)) //probably won't eval to true

একটি মন্তব্যের জবাবে, এটি চালানোর চেষ্টা করুন:

double x = 10.5f;
assert (x == asin(sin(x)));

এক্সকে তত্ত্বের ক্ষেত্রে সর্বদা আরকসিন (পাপ (এক্স)) সমান করা উচিত, তবে বাস্তবে এটি হয় না।


3
কেন না? আপনি ঠিক একই ডেটাতে ঠিক একই গণনা করছেন, উভয় ফলাফলেই ঠিক একই ত্রুটি থাকবে।
লরেন পেচটেল

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

আমার আপডেট দেখুন। আরকসাইন x এর পাপকে "পূর্বাবস্থায়" ফেলেছে, তাই তাদের সমান হওয়া উচিত, তবে তারা তা নয়।
জকি

এটি একই জিনিস নয়। লরেন যেমন বলেছিলেন, আপনি ঠিক একই ক্রিয়াকলাপটি চালিয়ে যাচ্ছেন x, যা সঠিক একই ত্রুটি সহ সঠিক ফলাফল অর্জন করবে। আরকসিন ভাসমান পয়েন্ট সংখ্যার সাথে একটি পাপের ফলাফলকে বিপরীত করতে পারে না কারণ পাস করা মানটি asin()ঠিক সঠিক হবে না। অতএব, ফলাফল asin()ভুল হবে, x == asin(sin(x))মিথ্যা করা। এছাড়াও, আরকসিন অগত্যা পাপ ক্রিয়াকলাপটিকে "পূর্বাবস্থায়িত" করে না x পাপের ক্রিয়াকলাপ x এর একাধিক মানের জন্য একই ফল দিতে পারে, এজন্য asin()কেবল -π / 2 এবং π / 2 এর মধ্যে কেবল সংখ্যাগুলি পাওয়া যায়।
hbw

2
অন্য কথায়, আরকসিন সর্বদা পাপ ফাংশনটিকে "পূর্বাবস্থায়" ফেলতে পারে না কারণ আরকসিনের পক্ষে মূল কোণটি কী তা জানা অসম্ভব। উদাহরণস্বরূপ, π / 2 এবং 5π / 2 উভয়ের পাপ 1 দেয়। তবে আরকসিন (1) কী? এটা স্পষ্টতই উভয়কে ফিরিয়ে দিতে পারে না, তাই না? সুতরাং, আরকসিনের ফলাফলটি অবশ্যই 2π রেডিয়ানের মধ্যে সীমাবদ্ধ থাকতে হবে, যার অর্থ এটি মূল পাপ কার্যের ফলাফলটিকে পূর্বাবস্থায়িত করতে পারে না যদি না মূল কোণ 0 এবং 2π এর মধ্যে থাকে বা সি এর ক্ষেত্রে, -π / 2 এবং π / 2। (প্রকৃতপক্ষে, আরকসিন (পাপ (5) / 2)) = π / 2।) যাইহোক, এটি একটি দীর্ঘ দীর্ঘ ব্যাখ্যা ছিল, তবে আমি আশা করি যে কোনও ভুল ধারণা পরিষ্কার করতে সহায়তা করবে।
hbw

0

অসীম লুপ নয়, একটি থ্রেড :)

import static B.*;
public class A {
    public static void main(String[] args) {
        System.out.println("Still Running");
        while (i == i) ;
    }
}


public class B {

    public static int i;
    static {
        System.exit(0);
    }
}

-1

i == iপারমাণবিক নয়। যেমন প্রোগ্রাম দ্বারা প্রমাণিত:

static volatile boolean i = true;
public static void main(String[] args) throws InterruptedException
{
    new Thread() {
        @Override
        public void run() {
            while (true) {
                i = !i;
            }
        }
    }.start();

    while (i == i) ;
    System.out.println("Not atomic! i: " + i);
}

আপডেট এখানে অসীম লুপের আরও একটি উদাহরণ রয়েছে (কোনও নতুন থ্রেড তৈরি হয় না)।

public class NoNewThreads {
    public static void main(String[] args) {
        new NoNewThreads();
        System.gc();
        int i = 500;
        System.out.println("Still Running");
        while (i == i) ;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        Thread.sleep(1000);
        System.exit(0);
    }
}

@ চার্লস গুডউইন আপনি এই সত্যটি কী বলেছেন যে একটি থ্রেড ব্যবহার করে জাভা প্রোগ্রাম লেখার কোনও সম্ভাবনা নেই :), তাই অন্য সমস্ত সমাধান কমপক্ষে দুটি থ্রেড ব্যবহার করে ('আপডেট' বিভাগে আমার দ্বিতীয় প্রোগ্রামের মতোই))
আন্দ্রে

এটি লুপটি ব্রেক করছে না। অভ্যাসের পরে কোনও কোড while (i == i);কখনই চালায় না।
aalku

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