2011-12-31 28 views
79

Tôi có một số int a cần phải bằng "vô cùng". Điều này có nghĩa là nếuĐặt int thành Infinity trong C++

int b = anyValue; 

a>b luôn đúng.

Có tính năng nào của C++ có thể làm cho điều này có thể xảy ra không?

+0

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

+3

Vâng, bạn cần một cái gì đó tương tự như vô cùng để thực hiện một ví dụ cơ bản của thuật toán Dijkstra. – jozefg

+1

@jozefg - OK, do đó, nó không phải là một kiểm tra người dùng là sau, chỉ là 'Max Value' thực hiện ngôn ngữ. – keyboardP

Trả lời

48

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

a>=b 

luôn luôn là sự thật.

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

#include <limits> 

//your code here 

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

//go off and lead a happy and productive life 

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" true, bạn sẽ phải sử dụng một đôi hoặc một phao. Sau đó, bạn chỉ có thể làm được điều này

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

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

Chúc mừng Mã hóa!Lưu ý: Như WTP đã đề cập, nếu cần thiết phải có một int là "vô hạn", bạn sẽ phải viết một lớp bọc cho một int và quá tải 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 .

+4

... và nếu bạn muốn sử dụng 'max()' hoặc 'infinity()' trong một mẫu mà kiểu số không xác định bạn sẽ cần sử dụng '+/- infinity()' iff 'std :: numeric_limits :: has_infinity' và ngược lại 'min()' và 'max()' –

91

Số nguyên vốn đã 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 đến giá trị tối đa int 's:

#include <limits> 

// ... 

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

Đó sẽ là 2^31 - 1 (hoặc 2 147 483 647) nếu int là 32 bit rộng tình hình thực hiện của bạn.

Nếu bạn thực sự cần vô cùng, hãy sử dụng loại số điểm nổi, như float hoặc double. Sau đó, bạn có thể vô cùng với:

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

Và nếu bạn * thực sự * cần vô cùng như một ** int **, hãy viết một lớp bao bọc mà quá tải các toán tử so sánh và có một biến boolean có tên là "is_infinity". –

+0

@WTP Xem xét anh ấy cần điều đó để thực hiện thuật toán của 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. –

+3

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

11

int vốn đã hữu hạn; không có giá trị nào thỏa mãn yêu cầu của bạn.

Nếu bạn sẵn sàng để thay đổi kiểu của b, tuy nhiên, bạn có thể làm điều này với ghi đè điều hành:

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 
} 
+9

* Hoặc * ... bạn chỉ có thể sử dụng float và 'std :: numeric_limits :: infinity()'. – Xeo

+0

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

-2

int min và max giá trị

Int -2147483648/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 để bình đẳng 9.223.372.036.854.775.807 nhưng nó sẽ cần phải là một Int64

nếu bạn luôn luôn muốn có một vắt mà b tại sao bạn cần phải kiểm tra xem nó? chỉ cần đặt nó thành sự thật luôn là

+1

Điều đó phụ thuộc ont việc thực hiện. Không có "Int64" trong C++ (trừ khi bạn đếm những thứ trong 'cstdint' của C++ 11). –

+0

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

+0

Tôi chỉ từng sử dụng công cụ xây dựng embarcadero C++ và nó có __int64, tôi không biết C++ khác không có nó. – Shaun07776

1

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

Chỉ cần sử dụng: (unsigned) ((int) 0)

Nó tạo ra số lượng lớn nhất có thể trong máy tính bất kỳ bằng cách gán cho tất cả các bit để 1s (cái) và sau đó sử dụng nó để unsigned

Thậm chí tốt hơn

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

và chỉ cần sử dụng INF dưới

Các vấn đề liên quan