Java'da sonsuzluk nasıl uygulanır?


139

Java'nın her sayısal veri türü için sonsuzluğu temsil edecek bir şeyi var mı? Matematiksel işlemleri yapabileceğim şekilde nasıl uygulanır?

Örneğin

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

Çok büyük sayılar kullanmayı denedim, ancak uygun ve kolay bir çözüm istiyorum .


10
sonsuz sayıda sonsuzluk vardır, hangisini modellemek istersiniz?
Dave Richardson

11
Neden ∞-∞==0doğru olmalı ? Ve ayrıca: Neden böyle bir şeye ihtiyacınız var?
Brimborium

Yanıtlar:


190

double Infinity'yi destekler

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

baskılar

Infinity
NaN
-Infinity

not: Infinity - Infinitybir bir sayı değil .


23
floatHassasiyeti oldukça zayıf olduğu için mümkün olduğunca kullanmaktan kaçınırım . ;)
Peter Lawrey

3
Dijkstra gibi algoritmalar uygulamak bana POSITIVE_INFINITY <POSITIVE_INFINITY olup olmadığını sorguluyor.
Joey Carson

41

Sanırım tamsayı matematiğini bir nedenle kullanıyorsunuz. Öyleyse, Integersınıfın MAX_VALUE alanını kullanarak işlevsel olarak POSITIVE_INFINITY ile hemen hemen aynı olan bir sonuç elde edebilirsiniz :

Integer myInf = Integer.MAX_VALUE;

(Ve NEGATIVE_INFINITY için MIN_VALUE kullanabilirsiniz.) Elbette bazı fonksiyonel farklılıklar olacaktır, örneğin myInfMAX_VALUE olan bir değerle karşılaştırıldığında : açıkça bu sayı küçüktür myInf.

Ayrıca POSITIVE_INFINITY ve NEGATIVE_INFINITY alanlarına sahip bir kütüphane de var, ancak bunlar sadece MAX_VALUE ve MIN_VALUE için yeni isimler.


11
Integer.MAX_VALUE + 5 ne kadar?
Erwin Smout

9
Integer.MAX_VALUE + 5, negatif tamsayılara sarılır. Tamsayı.MAX_VALUE + 5 = Tamsayı.MIN_VALUE + 4 = -2147483644.
Erick G. Hagstrom

'İşlevsel olarak neredeyse aynı' olduklarını Integer.MAX_VALUEsöylemekten ziyade sonsuzluk olarak kullanma arasındaki fark Double.POSITIVE_INFINITYnedir, o zaman fark nedir?
ahitt6345

1
@ ahitt6345 Integer.MAX_VALUEhala sonlu, sonsuzluğu taklit etmek için sadece bir hack. Ayrıca, Integer.MAX_VALUEsadece 32 bit Double.POSITIVE_INFINITY, 64 bittir.
mgthomas99

1
Integer.MAX_VALUE, girişinizde kullanılabilen geçerli bir sayıdır. op sonsuz değil, bir sayı değil, matematiksel bir sembol istedi.
refaelio

11

Kullanmak için Infinityaşağıdakileri Doubledestekler 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);

ÇIKTI : -

Infinity
-Infinity
-Infinity

Infinity 
NaN

5

DoubleVe Floattürleri vardır POSITIVE_INFINITYsabiti.


@ user1753100: Varsayılan olarak hayır, ancak bunun gibi bazı kütüphaneler: jscience.org bunu görünüşte uygular.
Tudor

1
Sonsuz değerleri Çiftler ve Şamandıralar ile sınırlamak keyfi görünüyor. Maksimum değerleri sonsuza Tamsayıların maksimum değerinden daha yakındır, ancak çok daha yakın değildir.
Patrick Brinich-Langlois

3
@ PatrickBrinich-Langlois kayan nokta tipleri (çift ve şamandıra gibi) tipik olarak sonsuzluğu doğrudan ifade edebilir (yani, türün maksimum değerinden farklı olarak, özellikle 'sonsuzluk' anlamına gelen bir bit deseni vardır). Double ve Float, Tamsayı ile ortak MAX_VALUE değerine sahiptir.
David Morris

7
"Maksimum değerleri sonsuza Tamsayıların maksimum değerinden daha yakın, ama çok daha yakın değil." Herhangi bir sonlu sayı sonsuzdan sonsuzdur;)
carlsb3rg

4

Java'nın her sayısal tür için sonsuzluğa sahip olduğundan emin değilim ama bazı sayısal veri türleri için cevap olumlu:

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

veya

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

Ayrıca, +/- sonsuzluk içeren bazı matematiksel işlemleri gösteren aşağıdaki makaleyi de yararlı bulabilirsiniz: Java Kayan Nokta Sayısı Girintileri .


4

Sadece Çift ve Şamandıra tipi POSITIVE_INFINITYsabit destekler .


2

Sayısal sargı tipleri için.

örneğin, Double.POSITVE_INFINITY

Umarım bu size yardımcı olabilir.


1
Tüm sayısal sargı tipleri için değil. Sadece Double ve Float için.
Erick G. Hagstrom

2

Genel bir çözüm yeni bir tür tanıtmaktır. Daha fazla dahil olabilir, ancak kendi sonsuzluğunu tanımlamayan herhangi bir tür için çalışma avantajına sahiptir.

Eğer Tbir türüdür lteqtanımlanır, tanımlayabilirsiniz InfiniteOr<T>ile lteqböyle bir şey:

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())

Bunu tam Java sözdizimine çevirmek için size bırakacağım. Umarım fikirler açıktır; ama onları heceleyelim.

Fikir, halihazırda mevcut olan bazı türlerle aynı değerlere ve ayrıca genel yöntemlerle anlayabildiğiniz kadarıyla - tam olarak sonsuzluğun hareket etmesini istediğiniz şekilde hareket eden özel bir değere sahip yeni bir tür oluşturmaktır. başka herhangi bir şey. Ben nullburada sonsuzluğu temsil etmek için kullanıyorum , çünkü bu Java'da en basit görünüyor.

Aritmetik işlemler eklemek istiyorsanız, ne yapmaları gerektiğine karar verin, ardından uygulayın. Öncelikle sonsuz vakaları ele alırsanız, ardından mevcut işlemleri orijinal türün sonlu değerleri üzerinde yeniden kullanırsanız muhtemelen en basit olanıdır.

Sağ taraftaki sonsuzluklardan önce sol taraftaki sonsuzlukların ele alınmasına ilişkin bir sözleşmenin benimsenmesinin faydalı olup olmadığı konusunda genel bir kalıp olabilir veya olmayabilir; Denemeden söyleyemem, ama eşit veya daha az ( lteq) için önce sağ taraftaki sonsuzluğa bakmak daha kolay olduğunu düşünüyorum. Ben dikkat lteqolduğunu değil değişmeli ama addve mulvardır; belki de alakalı.

Not: Sonsuz değerlerde ne olması gerektiğinin iyi bir tanımını bulmak her zaman kolay değildir. Karşılaştırma, toplama ve çarpma içindir, ama belki çıkarma değildir. Ayrıca, dikkat etmek isteyebileceğiniz sonsuz kardinal ve sıra sayıları arasında bir ayrım vardır.


Ek durumları temsil etmek için ekstra bir numaralandırma alanı kullanmak faydalı olabilir, bu nedenle negatif Infinity'ye de sahip olabilirsiniz , bu da genellikle arzu edilir ve -(yourvalue)düzgün çalışır. Bu da NaN (sayı değil) konseptini desteklemenizi sağlar. Bunun dışında, özellikle uygulama kayan nokta sayıları tarafından ihlal edilen anlambilime ihtiyaç duyduğunda, integral türlerinin üzerine özel değerler eklemek iyi bir fikir olabilir.
blubberdiblub

0

Number sınıfı son olmadığından, diğer yazılarda henüz bulamadığım bir fikir var. Yani Number sınıfını alt sınıflara ayırmak.

Bu bir şekilde Integer, Long, Double, Float, BigInteger ve BigDecimal için sonsuz sayılabilecek bir nesne sağlar.

Sadece iki değer olduğundan, tekli kalıbı kullanabiliriz:

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;
    }
}

Her nasılsa kalan yöntemler intValue (), longValue () vb .. sonra bir istisna atmak geçersiz kılınmalıdır düşünüyorum. Sonsuzluk değeri başka önlem alınmadan kullanılamaz.


0

Java'da yeni başlayan biriyim ... Java belgelerinde sonsuzluk için booleanve doubletürleri için başka bir uygulama buldum . https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3

Pozitif sıfır ve negatif sıfır eşittir; dolayısıyla 0.0 == - 0.0 ifadesinin sonucu doğrudur ve 0.0> -0.0 sonucu yanlıştır. Ancak diğer işlemler pozitif ve negatif sıfırı ayırt edebilir; örneğin, 1.0 / 0.0 değeri pozitif sonsuza sahipken, 1.0 / -0.0 değeri negatif sonsuzdur.

Çirkin görünüyor, ama işe yarıyor.

public class Main {

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.