Java에서 무한대를 구현하는 방법은 무엇입니까?


139

Java에는 모든 숫자 데이터 유형에 대해 무한대를 나타내는 것이 있습니까? 수학 연산을 수행 할 수 있도록 어떻게 구현됩니까?

예 :

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

나는 매우 큰 숫자를 사용하려고 시도했지만 적절하고 쉬운 해결책을 원합니다 .


10
무한한 수의 무한대가 있습니다. 어느 것을 모델링하고 싶습니까?
Dave Richardson

11
∞-∞==0진실 해야 합니까? 또한 : 왜 그런 것이 필요합니까?
brimborium

답변:


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정밀도가 매우 좋지 않기 때문에 가능할 때마다 사용하지 마십시오 . ;)
Peter Lawrey

3
Dijkstra와 같은 알고리즘을 구현하면 POSITIVE_INFINITY <POSITIVE_INFINITY의 여부를 의심하게됩니다.
Joey Carson

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 얼마입니까?
Erwin Smout

9
Integer.MAX_VALUE + 5는 음의 정수로 둘러싸입니다. 정수 MAX_VALUE + 5 = 정수 MIN_VALUE + 4 = -2147483644.
Erick G. Hagstrom

'기능적으로 거의 동일하다'고 말하지 Integer.MAX_VALUE않고 무한대로 사용 하는 Double.POSITIVE_INFINITY것의 차이점은 무엇입니까?
ahitt6345

1
@ ahitt6345 Integer.MAX_VALUE는 여전히 유한하며 무한대를 모방하기위한 해킹입니다. 또한 Integer.MAX_VALUE32 비트이지만 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);

출력 :-

Infinity
-Infinity
-Infinity

Infinity 
NaN

5

DoubleFloat유형은이 POSITIVE_INFINITY상수.


@ user1753100 : 기본적으로 아니요, jscience.org 와 같은 일부 라이브러리는 분명히 구현합니다.
Tudor

1
무한 값을 Doubles와 Floats로 제한하는 것은 임의적 인 것 같습니다. 최대 값은 정수의 최대 값보다 무한대에 가깝지만 그리 가깝지는 않습니다.
Patrick Brinich-Langlois

3
@ PatrickBrinich-Langlois 부동 소수점 유형 (예 : double 및 float)은 일반적으로 무한대를 직접 표현할 수 있습니다 (즉, 유형의 최대 값과는 별도로 '무한대'를 의미하는 비트 패턴이 있습니다). Double과 Float는 Integer와 공통으로 MAX_VALUE입니다.
David Morris

7
"그들의 최대 값은 정수의 최대 값보다 무한대에 가깝지만 그리 가깝지는 않습니다." 모든 유한 번호는 멀리 무한대에서 무한대)
carlsb3rg

4

Java가 모든 숫자 유형에 대해 무한대를 가지고 있는지 확실하지 않지만 일부 숫자 데이터 유형에 대한 대답은 긍정적입니다.

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

또는

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

또한 +/- 무한대와 관련된 수학적 연산을 나타내는 다음 기사를 유용하게 찾을 수 있습니다. Java 부동 소수점 수 복잡성 .


4

Double 및 Float 유형 만 POSITIVE_INFINITY상수를 지원 합니다.


2

숫자 래퍼 유형의 경우.

예 : Double.POSITVE_INFINITY

이것이 당신을 도울 수 있기를 바랍니다.


1
모든 숫자 래퍼 유형에 해당되는 것은 아닙니다. Double and Float 전용.
Erick G. Hagstrom

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

나는 이것을 정확한 Java 구문으로 번역하기 위해 당신에게 맡길 것입니다. 아이디어가 분명하기를 바랍니다. 어쨌든 철자를 쓰겠습니다.

아이디어는 이미 존재하는 일부 유형과 동일한 값과 공용 메소드를 통해 알 수있는 한 특별한 값을 갖는 새 유형을 작성하여 무한대가 원하는 방식으로 정확하게 작동하는 것입니다. 다른 것. nullJava에서 가장 간단한 것처럼 보이기 때문에 무한대를 나타내는 데 사용 하고 있습니다.

산술 연산을 추가하려면 수행 할 작업을 결정한 다음 구현하십시오. 무한 사례를 먼저 처리 한 다음 원래 유형의 유한 값에 대해 기존 작업을 재사용하는 것이 가장 간단합니다.

오른쪽 무한대 전에 왼쪽 무한대를 처리하는 규칙을 채택하는 것이 유리한지 아닌지에 대한 일반적인 패턴이있을 수도 있고 그렇지 않을 수도 있습니다. 시도하지 않고 말할 수는 없지만 같지 않은 ( lteq)의 경우 오른쪽 무한대를 먼저 보는 것이 더 간단하다고 생각합니다. 나는주의 lteq입니다 하지 교환 법칙이 성립하지만, add하고 mul있습니다; 어쩌면 그것은 관련이 있습니다.

참고 : 무한 값에서 발생하는 일에 대한 올바른 정의를 얻는 것이 항상 쉬운 것은 아닙니다. 비교, 덧셈 및 곱셈을위한 것이지만 뺄셈은 아닙니다. 또한 무한 추기경과 서수 사이에는주의를 기울여야 할 구분이 있습니다.


추가 상태를 나타 내기 위해 추가 열거 형 필드를 사용하는 것이 좋습니다. 따라서 음의 무한대 도 가질 수 있습니다 . 이는 종종 바람직하며 -(yourvalue)제대로 작동합니다. 또한 NaN (숫자가 아님) 개념 을 지원할 수 있습니다 . 그 외에도, 특히 응용 프로그램에 부동 소수점 숫자로 위반되는 의미가 필요한 경우 정수 유형 위에 특수 값을 추가하는 것이 좋습니다.
blubberdiblub

0

Number 클래스는 최종적이지 않기 때문에 다른 게시물에서 아직 찾지 못한 아이디어가 있습니다. 즉, 클래스 번호를 서브 클래 싱합니다.

이것은 어떻게 든 정수, Long, Double, Float, BigInteger 및 BigDecimal에 대해 무한대로 취급 될 수있는 객체를 제공합니다.

두 개의 값만 있으므로 싱글 톤 패턴을 사용할 수 있습니다.

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 () 등을 재정 의하여 예외를 throw해야한다고 생각합니다. 따라서 추가 예방 조치 없이는 무한대 값을 사용할 수 없습니다.


0

나는 Java의 초보자입니다 ... Java 문서에서 booleandouble유형에 대한 무한대에 대한 또 다른 구현을 발견했습니다 . https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3

양의 0과 음의 0은 같은 것을 비교합니다. 따라서 표현식 0.0 ==-0.0의 결과는 true이고 0.0> -0.0의 결과는 false입니다. 그러나 다른 연산은 양수와 음수 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);
    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.