Tôi có một int a
cầ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?
Max Value
triển khai ngôn ngữ.
a>b
kiểm tra :)
Tôi có một int a
cầ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?
Max Value
triển khai ngôn ngữ.
a>b
kiểm tra :)
Câu trả lời:
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 int
rộ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ư float
hoặc double
. Sau đó, bạn có thể nhận được vô hạn với:
double a = std::numeric_limits<double>::infinity();
int
giả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ờ.
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.
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_infinity
và nếu không min()
vàmax()
int
vố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
}
std::numeric_limits<float>::infinity()
.
Đâ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
#define INF ((unsigned) ~0)
, hãy xem ở đây .
Bạn cũng có thể sử dụng INT_MAX:
http://www.cplusplus.com/reference/climits/
nó tương đương với việc sử dụng numeric_limits.
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
cstdint
).
int
và các kiểu liên quan trong C ++.
float
s, có giá trị đại diện cho vô hạn.