2013-06-12 36 views
27

Tại sao thực hiện numeric_limits :: min trả lại giá trị âm cho int, nhưng giá trị dương cho ví dụ: nổi và đôi?Tại sao number_limits :: min trả về giá trị âm cho giá trị int nhưng dương cho float/double?

#include<iostream> 
#include<limits> 

using namespace std; 

int main() { 
    cout << "int: " << numeric_limits<int>::min() << " " 
     << "float: " << numeric_limits<float>::min() << " " 
     << "double: " << numeric_limits<double>::min() << "\n"; 
    return 0; 
} 

Output:

int: -2147483648 float: 1.17549e-38 double: 2.22507e-308 

Từ cppreference:

Trả về biểu diễn giá trị hữu hạn tối thiểu bởi các loại số T.

Đối với các loại dấu chấm động với denormalization , min trả về tối thiểu tích cực không giá trị rmalized. Lưu ý rằng hành vi này có thể là bất ngờ, đặc biệt là khi so sánh với hành vi của min đối với các loại tích phân. Để tìm giá trị không có giá trị nhỏ hơn, hãy sử dụng numeric_limits::lowest.

phút chỉ có ý nghĩa đối với các loại bị chặn và cho các loại không dấu không bị chặn, tức là các loại đại diện cho một tập hợp giá trị âm không giới hạn không có nghĩa là tối thiểu.

+0

Đối với các giá trị điểm động, phút được xác định là số * dương * nhỏ nhất được thể hiện chính xác theo loại đó. –

Trả lời

30

Theo định nghĩa, với nhiều loại nổi, min trả về nhỏ giá trị tích cực các loại có thể mã hóa, không phải là thấp nhất.

Nếu bạn muốn có giá trị thấp nhất, hãy sử dụng numeric_limits::lowest để thay thế.

Tài liệu: http://en.cppreference.com/w/cpp/types/numeric_limits/min

Đối với tại sao nó là cách này, tôi chỉ có thể suy đoán rằng ủy ban tiêu chuẩn cần thiết để có một cách để đại diện cho tất cả các dạng giá trị cực cho tất cả các loại có nguồn gốc khác nhau. Trong trường hợp các loại tích phân, chỉ có hai loại cực: cực đại và cực đại. Đối với phao nổi khác: nhỏ nhất có thể.

Nếu bạn cho rằng ngữ nghĩa hơi lộn xộn một chút, tôi đồng ý. Các ngữ nghĩa của các số liên quan #define s trong tiêu chuẩn C bị lẫn lộn theo cùng một cách.

+0

Cảm ơn sự đầu cơ. Nó có ý nghĩa rằng một trong những nhu cầu thông tin về cả hai loại nhỏ nhất có thể. Tôi chỉ tìm thấy nó thực sự kỳ lạ mà cả hai cũng được xác định cho số nguyên mặc dù họ trở về cùng một giá trị. Nghĩ rằng có lẽ có một lý do sâu sắc hơn cho điều đó. – gnzlbg

+4

@gnzlbg: Tôi không biết chắc chắn, nhưng tôi nghi ngờ có bất kỳ lý do nào sâu sắc hơn chỉ đơn giản là "Đó là những gì C đã làm." –

+0

bạn có chắc chắn về "giá trị dương nhỏ nhất" không? Đầu ra từ OP trông âm cho int, và cppreference.com nói "giá trị hữu hạn nhỏ nhất".Trình biên dịch của tôi là (vẫn) không tuân thủ C++ 11, vì vậy tôi không thể sử dụng thấp nhất :-( – craq

5

Thật không may, nhưng đằng sau những tên tương tự hoàn toàn khác nhau có nghĩa là nằm. Nó được chuyển từ C, trong đó DBL_MIN và INT_MIN có cùng một "vấn đề".

Vì không thể thực hiện được nhiều, chỉ cần nhớ ý nghĩa của những gì.

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