Đặt int thành Infinity trong C ++


114

Tôi có một int acần phải bằng "vô cùng". Điều này có nghĩa là nếu

int b = anyValue;

a>b luôn luôn đúng.

Có tính năng nào của C ++ có thể thực hiện được điều này không?


Bạn chỉ có thể sử dụng floats, có giá trị đại diện cho vô hạn.
Xeo

1
@jozefg - Được rồi, vì vậy người dùng không phải kiểm tra mà chỉ là việc Max Valuetriển khai ngôn ngữ.
keyboardP

4
@jozefg Ha, tôi nghĩ là bạn sẽ triển khai A *. Tôi đã rất gần!
Etienne de Martel

2
@jozefg - Có lý. Tôi nghĩ OP muốn thực hiện các a>bkiểm tra :)
keyboardP

1
@Hikari: Không, tôi đang nói rằng không có cách nào để biểu diễn vô cực trong một kiểu số nguyên. Bạn có thể tạo một lớp với các toán tử quá tải.
Keith Thompson

Câu trả lời:


130

Số nguyên vốn có hữu hạn. Gần nhất bạn có thể nhận được là bằng cách thiết lập ađể int's giá trị lớn nhất:

#include <limits>

// ...

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

Sẽ là 2^31 - 1(hoặc 2 147 483 647) nếu intrộng 32 bit trong quá trình triển khai của bạn.

Nếu bạn thực sự cần vô cực, hãy sử dụng kiểu số dấu phẩy động, như floathoặc double. Sau đó, bạn có thể nhận được vô hạn với:

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

37
Và nếu bạn thực sự cần infinity như một int , hãy viết một lớp wrapper nạp chồng các toán tử so sánh và có một biến boolean có tên "is_infinity".

@WTP Xem xét anh ấy cần điều đó để triển khai thuật toán Dijkstra, tôi nghi ngờ điều đó là cần thiết. Nhưng đó là sự lựa chọn hợp lý nhất nếu không.
Etienne de Martel,

4
Tôi đã thêm nhận xét cho những khách truy cập trong tương lai, những người không triển khai thuật toán Dijkstra, nhưng cần nó cho việc khác. :)

Có vẻ như chúng tôi có một ứng cử viên cho huy hiệu vàng ở đây. :) +1 cho cả hai bạn!
Mysticial

2
Lưu ý rằng nếu bạn sử dụng cách intgiải thì phải hết sức cẩn thận với số học: thêm một số dương vào “vô cùng” sẽ thu được một kết quả rất bất ngờ.
Lambda Fairy

67

Số nguyên là hữu hạn, thật đáng buồn là bạn không thể đặt nó thành vô cực thực sự. Tuy nhiên, bạn có thể đặt nó thành giá trị tối đa của một int, điều này có nghĩa là nó sẽ lớn hơn hoặc bằng bất kỳ int nào khác, tức là:

a>=b

luôn luôn đúng.

Bạn sẽ làm điều này bằng cách

#include <limits>

//your code here

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

//go off and lead a happy and productive life

Con số này thường sẽ bằng 2.147.483.647

Nếu bạn thực sự cần một giá trị "vô hạn" thực sự, bạn sẽ phải sử dụng double hoặc float. Sau đó, bạn có thể chỉ cần làm điều này

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

Giải thích bổ sung về giới hạn số có thể được tìm thấy tại đây

Chúc bạn mã hóa vui vẻ!

Lưu ý: Như WTP đã đề cập, nếu nhất thiết phải có một int là "vô hạn", bạn sẽ phải viết một lớp bao bọc cho một int và nạp chồng các toán tử so sánh, mặc dù điều này có lẽ không cần thiết cho hầu hết các dự án.


6
... và nếu bạn muốn sử dụng max()hoặc infinity()trong một mẫu mà kiểu số chưa được biết rõ, bạn sẽ cần phải sử dụng +/-infinity()khi và chỉ khi std::numeric_limits<T>::has_infinityvà nếu không min()max()
Ben Jackson

13

intvốn dĩ là hữu hạn; không có giá trị nào đáp ứng yêu cầu của bạn.

Tuy nhiên, nếu bạn sẵn sàng thay đổi loại b, bạn có thể thực hiện việc này bằng cách ghi đè toán tử:

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
Hoặc ... bạn có thể sử dụng float và std::numeric_limits<float>::infinity().
Xeo

1
@Xeo, chắc chắn, đó là một lựa chọn quá :)
bdonlan

5

Đây là một thông điệp cho tôi trong tương lai:

Chỉ dùng: (unsigned)!((int)0)

Nó tạo ra số lớn nhất có thể trong bất kỳ máy nào bằng cách gán tất cả các bit thành 1s (đơn vị) và sau đó chuyển nó thành không dấu

Thậm chí còn tốt hơn

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

Và sau đó chỉ cần sử dụng INF trong mã của bạn


4
Tôi nghĩ bạn có nghĩa là #define INF ((unsigned) ~0), hãy xem ở đây .
Paul Sanders


-2

int giá trị tối thiểu và tối đa

Int -2.147.483.648 / 2.147.483.647 Int 64 -9.223.372.036.854.775.808 / 9.223.372.036.854.775.807

tôi đoán bạn có thể đặt a bằng 9.223.372.036.854.775.807 nhưng nó sẽ cần phải là int64

nếu bạn luôn muốn a trở thành grater mà b tại sao bạn cần kiểm tra nó? chỉ cần đặt nó là đúng luôn luôn


1
Điều đó phụ thuộc vào việc thực hiện. Không có "Int64" trong C ++ (trừ khi bạn đếm những thứ trong C ++ 11 cstdint).
Etienne de Martel

@Shaun, để mở rộng những gì Etienne đã nói, stackoverflow.com/questions/589575/size-of-int-long-etc giải thích ý nghĩa intvà các kiểu liên quan trong C ++.
Mike Samuel,

Tôi chỉ từng sử dụng trình xây dựng embarcadero c ++ và nó có __int64, tôi không biết c ++ khác cũng không có nó.
Shaun07776,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.