C ++에서 int를 Infinity로 설정


114

나는 int a"무한대"와 같을 필요가있다. 이것은

int b = anyValue;

a>b 항상 사실입니다.

이를 가능하게하는 C ++의 기능이 있습니까?


float무한대를 나타내는 값을 가진 s를 사용할 수 있습니다 .
Xeo

1
@jozefg-좋아요, 사용자가 확인한 것이 아니라 Max Value언어 구현 일뿐 입니다.
keyboardP

4
@jozefg Ha, 나는 당신이 A *를 구현할 것이라고 생각했습니다. I이었다 너무 가까이!
Etienne de Martel 2011

2
@jozefg-말이 되네요. 나는 영업 이익은 실제로 수행하기 원한다고 생각 a>b:) 체크
keyboardP

1
@ 히카리 : 아니요, 정수형으로 무한대를 표현할 수있는 방법이 없다는 것입니다. 오버로드 된 연산자로 클래스를 만들 수 있습니다.
Keith Thompson

답변:


130

정수는 본질적으로 유한합니다. 가장 가까운 것은 의 최대 값 으로 설정 a하는 것입니다 int.

#include <limits>

// ...

int a = std::numeric_limits<int>::max();

어느 것 2^31 - 1(또는 2 147 483 647경우) int구현에 32 비트입니다.

당신이 경우 정말 무한대 필요, 부동 소수점 숫자 형식을 사용 같은 floatdouble. 그런 다음 다음으로 무한대를 얻을 수 있습니다.

double a = std::numeric_limits<double>::infinity();

37
그리고 정말로 int 로 무한대가 필요한 경우 비교 연산자를 오버로드하고 "is_infinity"라는 부울 변수를 갖는 래퍼 클래스를 작성하십시오.

@WTP 그가 Dijkstra의 알고리즘 구현을 위해 필요하다고 생각하면 그게 필요할 것 같지 않습니다. 그러나 그렇지 않으면 가장 현명한 선택입니다.
Etienne de Martel 2011

4
Dijkstra의 알고리즘을 구현하지 않지만 다른 알고리즘이 필요한 미래 방문자를 위해 주석을 추가했습니다. :)

여기 금 배지 후보가있는 것 같습니다. :) 둘 다 +1!
Mysticial

2
int솔루션 을 사용하는 경우 산술에 매우주의해야합니다. "무한대"에 양수를 추가하면 예상치 못한 결과가 생성됩니다.
Lambda Fairy

67

정수는 유한하므로 슬프게도 진정한 무한대로 설정할 수 없습니다. 그러나 int의 최대 값으로 설정할 수 있습니다. 이것은 다른 int보다 크거나 같음을 의미합니다. 즉 :

a>=b

항상 사실입니다.

당신은 이것을 할 것입니다

#include <limits>

//your code here

int a = std::numeric_limits<int>::max();

//go off and lead a happy and productive life

일반적으로 2,147,483,647과 같습니다.

진정한 "무한"값이 정말로 필요한 경우 double 또는 float를 사용해야합니다. 그런 다음 간단히 할 수 있습니다.

float a = std::numeric_limits<float>::infinity();

숫자 제한에 대한 추가 설명은 여기 에서 찾을 수 있습니다.

행복한 코딩!

참고 : WTP가 언급했듯이 "무한"인 int가 반드시 필요한 경우 int에 대한 래퍼 클래스를 작성하고 비교 연산자를 오버로드해야하지만 대부분의 프로젝트에는 필요하지 않습니다.


6
당신이 사용하려는 경우 ... 그리고 max()infinity()수치의 종류를 알 수없는 경우 템플릿에서 당신은 사용해야합니다 +/-infinity()IFF를 std::numeric_limits<T>::has_infinity달리하고 min()하고max()
벤 잭슨

13

int본질적으로 유한하다. 귀하의 요구 사항을 충족하는 가치는 없습니다.

b하지만 유형을 변경하려면 연산자 재정의를 사용하여이 작업을 수행 할 수 있습니다.

class infinitytype {};

template<typename T>
bool operator>(const T &, const infinitytype &) {
  return false;
}

template<typename T>
bool operator<(const T &, const infinitytype &) {
  return true;
}

bool operator<(const infinitytype &, const infinitytype &) {
  return false;
}


bool operator>(const infinitytype &, const infinitytype &) {
  return false;
}

// add operator==, operator!=, operator>=, operator<=...

int main() {
  std::cout << ( INT_MAX < infinitytype() ); // true
}

10
또는 ... float 및 std::numeric_limits<float>::infinity().
Xeo

1
@Xeo, 물론, 그 옵션이 :) 너무입니다
bdonlan

5

이것은 나에게 미래에 대한 메시지입니다.

다음을 사용하십시오. (unsigned)!((int)0)

모든 비트를 1 (1)에 할당하여 모든 컴퓨터에서 가능한 가장 큰 숫자를 생성 한 다음 unsigned로 캐스트합니다.

더 나은

#define INF (unsigned)!((int)0)

그런 다음 코드에서 INF를 사용하십시오.


4
제 생각 #define INF ((unsigned) ~0)에는 여기를보세요 .
Paul Sanders


-2

int 최소 및 최대 값

정수 -2,147,483,648 / 2,147,483,647 정수 64 -9,223,372,036,854,775,808 / 9,223,372,036,854,775,807

나는 당신이 9,223,372,036,854,775,807과 같도록 설정할 수 있다고 생각하지만 int64가 필요합니다.

당신이 항상 a가 더 강해지기를 원한다면 b 왜 그것을 확인해야합니까? 항상 사실로 설정하십시오.


1
그것은 구현에 달려 있습니다. C ++에는 "Int64"가 없습니다 (C ++ 11의 항목을 세지 않는 한 cstdint).
Etienne de Martel 2011

@Shaun, Etienne의 말을 확장하기 위해 stackoverflow.com/questions/589575/size-of-int-long-etcintC ++ 의 의미 와 관련 유형을 설명합니다 .
Mike Samuel

저는 엠바 카데로 C ++ 빌더 만 사용 해본 적이 있고 __int64가 있습니다. 다른 C ++도 가지고 있지 않다는 것을 몰랐습니다.
Shaun07776 dec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.