2013-03-11 49 views
22

Bây giờ tôi đã tình cờ gặp sự thật, rằng hàm C++ floor trả về cùng một loại mà bạn truyền cho nó, có thể là float, double hoặc như vậy.Tại sao sàn không trả về một số nguyên?

Theo this reference, hàm trả về giá trị tích phân làm tròn xuống. Tại sao đây không phải là một số nguyên?

+0

Có lẽ vì lý do tương tự như [tag: c]. – Johnsyweb

+2

liên quan: http://stackoverflow.com/questions/511921/why-does-math-floor-return-a-double –

+0

Vấn đề lập trình thực tế của bạn là gì? Bạn có cần phiên bản 'tầng' trả về một int không? –

Trả lời

45

Vì loại tích phân không nhất thiết có thể giữ cùng giá trị tích phân như float hoặc double.

int main(int argc, char *argv[]) { 
    std::cout << floor(std::numeric_limits<float>::max()) << std::endl; 
    std::cout << static_cast<long>(floor(std::numeric_limits<float>::max())) << ::endl; 
} 

kết quả đầu ra (trên kiến ​​trúc x86_64 của tôi)

3.40282e+38 
-9223372036854775808 

Bên cạnh đó, các giá trị dấu chấm động có thể giữ NaN, + Inf, và -INF, tất cả đều được bảo quản bằng một thao tác floor(). Không có giá trị nào trong số này có thể được biểu diễn bằng một loại tích phân.

int main(int argc, char *argv[]) { 
    std::cout << floor(std::numeric_limits<float>::quiet_NaN()) << std::endl; 
    std::cout << floor(std::numeric_limits<float>::infinity()) << std::endl; 
    std::cout << floor(-std::numeric_limits<float>::infinity()) << std::endl; 
} 

đầu ra

nan 
inf 
-inf 
+0

+1 để minh họa. – Johnsyweb

+5

Câu trả lời này tốt hơn câu trả lời được chấp nhận trong bản dupe. – Omnifarious

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