जावा में अनन्तता कैसे लागू करें?


138

क्या जावा में हर संख्यात्मक डेटा प्रकार के लिए अनंत का प्रतिनिधित्व करने के लिए कुछ भी है? इसे ऐसे कैसे लागू किया जाता है कि मैं इसके साथ गणितीय कार्य कर सकता हूं?

उदाहरण के लिए

int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity

मैंने बहुत बड़ी संख्या का उपयोग करने की कोशिश की है, लेकिन मैं एक उचित, आसान समाधान चाहता हूं ।


10
अनंत संख्या में शिशु हैं, जिन्हें आप मॉडल बनाना पसंद करेंगे?
डेव रिचर्डसन

11
क्यों ∞-∞==0सच होना चाहिए? और यह भी: आपको ऐसी चीज की आवश्यकता क्यों है?
ब्रिम्बोरियम

जवाबों:


190

double अनंत का समर्थन करता है

double inf = Double.POSITIVE_INFINITY;
System.out.println(inf + 5);
System.out.println(inf - inf); // same as Double.NaN
System.out.println(inf * -1); // same as Double.NEGATIVE_INFINITY

प्रिंट

Infinity
NaN
-Infinity

ध्यान दें: Infinity - Infinityहै नंबर नहीं है


23
floatजब भी संभव हो मैं इसका उपयोग करने से बचता हूं क्योंकि इसकी परिशुद्धता बहुत खराब है। ;)
पीटर लॉरी

3
दिज्क्स्ट्रा जैसे एल्गोरिदम को लागू करने से मुझे यह प्रश्न करना है कि क्या POSITIVE_INFINITY <POSITIVE_INFINITY।
जोए कार्सन

41

मुझे लगता है कि आप एक कारण के लिए पूर्णांक गणित का उपयोग कर रहे हैं। यदि हां, तो आप Integerकक्षा के MAX_VALUE फ़ील्ड का उपयोग करके कार्यात्मक रूप से लगभग POSITIVE_INFINITY के समान परिणाम प्राप्त कर सकते हैं :

Integer myInf = Integer.MAX_VALUE;

(और NEGATIVE_INFINITY के लिए आप MIN_VALUE का उपयोग कर सकते हैं।) बेशक कुछ कार्यात्मक अंतर होंगे, उदाहरण के लिए, जब myInfMAX_VALUE होने वाले मान की तुलना की जाती है: स्पष्ट रूप से यह संख्या इससे कम नहीं है myInf

एक पुस्तकालय भी है जिसमें वास्तव में POSITIVE_INFINITY और NEGATIVE_INFINITY के क्षेत्र हैं, लेकिन वे वास्तव में MAX_VALUE और MIN_VALUE के नए नाम हैं।


11
Integer.MAX_VALUE + 5 कितना है?
एरविन स्मौट

9
Integer.MAX_VALUE + 5 नकारात्मक पूर्णांकों में घूमता है। Integer.MAX_VALUE + 5 = Integer.MIN_VALUE + 4 = -2147483644
एरिक जी। हागस्ट्रॉम

व्हाट्सएप को अंतर के Integer.MAX_VALUEरूप में उपयोग करने के बीच अंतर के बजाय Double.POSITIVE_INFINITYआपने कहा कि वे 'कार्यात्मक रूप से लगभग समान हैं', इसलिए अंतर क्या है?
आहिट ६३४५

1
@ ahitt6345 Integer.MAX_VALUEअभी भी परिमित है, इसकी अनंतता की नकल करने के लिए सिर्फ एक हैक है। इसके अलावा, Integer.MAX_VALUEकेवल 32-बिट्स है जबकि Double.POSITIVE_INFINITY64-बिट्स है।
mgthomas99

1
Integer.MAX_VALUE एक वैध संख्या है जिसका उपयोग आपके इनपुट में किया जा सकता है। op ने अनंत के लिए कहा, जो एक संख्या नहीं है, लेकिन एक गणितीय प्रतीक है।
Refaelio

11

उपयोग करने के लिए Infinity, आप उपयोग कर सकते हैं Doubleजो समर्थन करता है Infinity: -

    System.out.println(Double.POSITIVE_INFINITY);
    System.out.println(Double.POSITIVE_INFINITY * -1);
    System.out.println(Double.NEGATIVE_INFINITY);

    System.out.println(Double.POSITIVE_INFINITY - Double.NEGATIVE_INFINITY);
    System.out.println(Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY);

OUTPUT : -

Infinity
-Infinity
-Infinity

Infinity 
NaN

5

Doubleऔर Floatप्रकार है POSITIVE_INFINITYनिरंतर।


@ user1753100: डिफ़ॉल्ट रूप से, लेकिन कुछ पुस्तकालय, जैसे यह एक: jscience.org इसे स्पष्ट रूप से लागू करते हैं।
ट्यूडर

1
यह डबल्स और फ्लैट्स के लिए अनंत मूल्यों को प्रतिबंधित करने के लिए मनमाना लगता है। उनके अधिकतम मूल्य इंटिजर्स के अधिकतम मूल्य की तुलना में अनंत के करीब हैं, लेकिन बहुत करीब नहीं हैं।
पैट्रिक ब्रिंच-लैंग्लोइस

3
@ पैट्रिकब्रिनिच-लैंग्लोइस फ्लोटिंग-पॉइंट प्रकार (जैसे डबल और फ्लोट) आमतौर पर सीधे अनंत को व्यक्त करने में सक्षम होते हैं (यानी, थोड़ा पैटर्न है जिसका विशेष रूप से मतलब है 'अनंत', प्रकार के अधिकतम मूल्य से अलग)। डबल और फ्लोट में इंटीजर के साथ MAX_VALUE है।
डेविड मॉरिस

7
"उनके अधिकतम मूल्य इंटिजर्स के अधिकतम मूल्य की तुलना में अनंत के करीब हैं, लेकिन बहुत करीब नहीं हैं।" कोई भी परिमित संख्या अनंत से अनंत है;)
carlsb3rg

4

मुझे यकीन नहीं है कि जावा में प्रत्येक संख्यात्मक प्रकार के लिए अनंत है लेकिन कुछ संख्यात्मक डेटा प्रकारों के लिए उत्तर सकारात्मक है:

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

या

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

इसके अलावा, आप निम्नलिखित लेख को उपयोगी पा सकते हैं जो कुछ गणितीय क्रियाओं का प्रतिनिधित्व करता है जिसमें +/- अनंत शामिल हैं: जावा फ्लोटिंग-पॉइंट नंबर पेचीदगियां


4

केवल डबल और फ्लोट प्रकार POSITIVE_INFINITYनिरंतर का समर्थन करते हैं ।


2

संख्यात्मक आवरण प्रकारों के लिए।

उदाहरण के लिए Double.POSITVE_INFINITY

आशा है कि यह आपकी मदद कर सकता है।


1
सभी संख्यात्मक आवरण प्रकारों के लिए नहीं। सिर्फ डबल और फ्लोट के लिए।
इरिक जी। हागस्ट्रॉम

2

एक सामान्य समाधान एक नए प्रकार का परिचय देना है। यह अधिक शामिल हो सकता है, लेकिन इसमें किसी भी प्रकार के लिए काम करने का लाभ है जो अपनी स्वयं की अनंतता को परिभाषित नहीं करता है।

अगर Tहै, जिसके लिए एक प्रकार lteqपरिभाषित किया गया है, तो आप को परिभाषित कर सकते InfiniteOr<T>के साथ lteqकुछ इस तरह:

class InfiniteOr with type parameter T:
    field the_T of type null-or-an-actual-T
    isInfinite()
        return this.the_T == null
    getFinite():
        assert(!isInfinite());
        return this.the_T
    lteq(that)
        if that.isInfinite()
            return true
        if this.isInfinite()
            return false
        return this.getFinite().lteq(that.getFinite())

मैं इसे सटीक जावा सिंटैक्स में अनुवाद करने के लिए आपके पास छोड़ दूँगा। मुझे उम्मीद है कि विचार स्पष्ट हैं; लेकिन मैं उन्हें किसी भी तरह से जादू कर दूं।

यह विचार एक नया प्रकार बनाने के लिए है जिसमें सभी समान मूल्य पहले से मौजूद कुछ प्रकार के हैं, साथ ही एक विशेष मूल्य है - जहां तक ​​आप सार्वजनिक विधियों के माध्यम से बता सकते हैं- ठीक उसी तरह जिस तरह से आप कार्य करने के लिए अनंत चाहते हैं, जैसे कि यह उससे अधिक है और कुछ। मैं उपयोग कर रहा हूँnull यहां अनंत का प्रतिनिधित्व करने के लिए , क्योंकि यह जावा में सबसे सीधा लगता है।

यदि आप अंकगणितीय संचालन जोड़ना चाहते हैं, तो तय करें कि उन्हें क्या करना चाहिए, फिर उस पर अमल करें। यह शायद सबसे सरल है यदि आप पहले अनंत मामलों को संभालते हैं, तो मूल प्रकार के परिमित मूल्यों पर मौजूदा संचालन का पुन: उपयोग करें।

दाएं-हाथ की ओर के शिशुओं या इसके विपरीत, बाएं-हाथ की ओर की शिशुओं को संभालने के एक सम्मेलन को अपनाने के लिए फायदेमंद है या नहीं, यह सामान्य पैटर्न हो सकता है या नहीं भी हो सकता है; मैं इसे आज़माए बिना नहीं बता सकता, लेकिन कम-से-या-बराबर ( lteq) के लिए मुझे लगता है कि पहले दाहिने हाथ की अनंतता को देखना सरल है। मैं ध्यान दें कि lteqहै नहीं , विनिमेय लेकिन addऔरmul कर रहे हैं; शायद यह प्रासंगिक है।

नोट: अनंत मूल्यों पर जो होना चाहिए उसकी अच्छी परिभाषा के साथ आना हमेशा आसान नहीं होता है। यह तुलना, जोड़ और गुणा के लिए है, लेकिन शायद घटाव नहीं है। इसके अलावा, अनंत कार्डिनल और क्रमिक संख्याओं के बीच एक अंतर है, जिस पर आप ध्यान देना चाहते हैं।


अतिरिक्त राज्यों का प्रतिनिधित्व करने के लिए एक अतिरिक्त एनम फ़ील्ड का उपयोग करना सार्थक हो सकता है, इसलिए आपके पास नकारात्मक इन्फिनिटी भी हो सकती है, जो अक्सर वांछनीय होती है और -(yourvalue)ठीक से काम करती है। और यह आपको NaN (संख्या नहीं) अवधारणा का समर्थन करने की भी अनुमति देगा । इसके अलावा, अभिन्न प्रकारों के शीर्ष पर विशेष मूल्यों को जोड़ना एक अच्छा विचार हो सकता है, खासकर जब एप्लिकेशन को अस्थायी बिंदु संख्याओं का उल्लंघन करने वाले शब्दार्थ की आवश्यकता होती है।
ब्लबरडाइब्लूब

0

चूँकि वर्ग संख्या अंतिम नहीं है, यहाँ एक विचार है, कि मुझे अन्य पदों में अभी तक नहीं मिला है। कक्षा संख्या को उप-करने के लिए नामांकित करें।

यह किसी भी तरह एक ऐसी वस्तु पहुंचाएगा जिसे इंटेगर, लॉन्ग, डबल, फ्लोट, बिगइंटर और बिगडिमल के लिए अनंत माना जा सकता है।

चूंकि केवल दो मूल्य हैं, हम सिंगलटन पैटर्न का उपयोग कर सकते हैं:

public final class Infinity extends Number {
    public final static Infinity POSITIVE = new Infinity(false);
    public final static Infinity NEGATIVE = new Infinity(true);
    private boolean negative;
    private Infinity(boolean n) {
        negative = n;
    }
}

किसी तरह मुझे लगता है कि शेष तरीकों intValue (), longValue () आदि .. तो एक अपवाद फेंकने के लिए अतिरंजित होना चाहिए। ताकि आगे की सावधानियों के बिना अनन्तता मूल्य का उपयोग न किया जा सके।


0

मैं जावा में शुरुआत कर रहा हूं ... मुझे जावा प्रलेखन में अनन्तता के लिए एक और कार्यान्वयन मिला, booleanऔर doubleप्रकारों के लिए। https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3

सकारात्मक शून्य और नकारात्मक शून्य बराबर की तुलना करते हैं; इस प्रकार ०.० == - ०.० का परिणाम सत्य है और ०.०> -0.0 का परिणाम गलत है। लेकिन अन्य संचालन सकारात्मक और नकारात्मक शून्य को भेद कर सकते हैं; उदाहरण के लिए, 1.0 / 0.0 का मान धनात्मक अनंत है, जबकि 1.0 / -0.0 का मान ऋणात्मक अनंत है।

यह बदसूरत दिखता है, लेकिन यह काम करता है।

public class Main {

    public static void main(String[] args) {
        System.out.println(1.0/0.0);
        System.out.println(-1.0/0.0);
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.