2010-04-12 28 views
5

Tôi muốn thực hiện chức năng số nguyên lớn nhất. [Các "chức năng số nguyên lớn nhất" là một quitestandard name cho những gì còn được gọi là chức năng sàn.]Chức năng sàn số nguyên C++

int x = 5/3; 

Câu hỏi của tôi là với số lượng lớn có thể có là một tổn thất chính xác như 5/3 sẽ tạo ra một đôi ?

EDIT: Hàm số nguyên Greatest là số nguyên nhỏ hơn hoặc bằng X. Ví dụ:

4.5 = 4 
4 = 4 
3.2 = 3 
3 = 3 

Những gì tôi muốn biết là 5/3 sẽ tạo ra một đôi? Bởi vì nếu như vậy tôi sẽ mất độ chính xác khi chuyển sang int.

Hy vọng điều này có ý nghĩa.

+2

chức năng số nguyên lớn nhất là gì? – Andrey

+0

Lưu ý rằng trong C và C++, toán tử '/' hoạt động trên các số nguyên luôn trả về kết quả nguyên. Ngoài ra, tôi nghĩ rằng bạn cần phải cụ thể hơn về những gì bạn muốn --- là chức năng của bạn sẽ trả lại số nguyên lớn nhất ** ít tham ** một số nhất định? Loại số đó sẽ có? Nếu đó là một 'float' hoặc' double', bạn sẽ mất chính xác bất kể. Nếu đó là loại nhà phát triển mô hình ** số ** hợp lý, bạn có thể tránh mất độ chính xác. – Pillsy

+4

Đó là một hàm trả về * số nguyên * lớn nhất từ ​​trước đến nay! Tôi tin rằng cái lớn nhất là 1.000.001 –

Trả lời

5

Bạn sẽ mất phần phân số của thương. Vì vậy, có, với số lượng lớn hơn, bạn sẽ có độ chính xác tương đối hơn, chẳng hạn như so sánh với 5000/3000.

Tuy nhiên, 5/3 sẽ trả về một số nguyên chứ không phải gấp đôi. Để buộc nó chia làm gấp đôi, hãy nhập cổ tức là (double)5/3.

+0

Cảm ơn tất cả những gì tôi cần biết. – Thomas

1

5/3 sẽ luôn tạo 1 (số nguyên), nếu bạn thực hiện 5.0/3 hoặc 5/3.0, kết quả sẽ là gấp đôi.

0

Vì trong C và C++, như những người khác đã nói,/là phân chia số nguyên, nó sẽ trả về một int. đặc biệt, nó sẽ trả về tầng của câu trả lời kép ... (C và C++ luôn cắt ngắn) Vì vậy, về cơ bản 5/3 là chính xác những gì bạn muốn.

Nó có thể có được một chút kỳ lạ trong âm như -5/3 => -2 mà có thể hoặc không thể là những gì bạn muốn ...

+4

Nhưng nếu bạn thông minh, bạn có thể sử dụng âm bản để thực thi số nguyên 'ceil()' ... –

+0

heh này là đúng. –

+1

Đó là ** không ** đúng là phân chia số nguyên trả về sàn! Điểm quan trọng (thường bị bỏ qua) là cách xử lý các số * âm *. Ở đây -9/4 == -2 nhưng sàn (-9.0/4) == -3.0 – Ichthyo

2

Phép chia số nguyên cho kết quả số nguyên, do đó 5/3 là 1 và 5% 3 là 2 (toán tử còn lại). Tuy nhiên, điều này không nhất thiết phải giữ với số âm. Trong tiêu chuẩn C++ ban đầu, -5/3 có thể là -1 (làm tròn về 0) hoặc -2 (tầng), nhưng -1 được khuyến nghị. Trong bản thảo C++ 0B mới nhất (gần như chắc chắn rất gần với tiêu chuẩn cuối cùng), nó là -1, vì vậy việc tìm kiếm sàn có số âm là tham gia nhiều hơn.

0

Theo như tôi biết, không có hàm được xác định trước cho mục đích này. Nó có thể là cần thiết để sử dụng một chức năng như vậy, nếu vì một lý do nào tính toán dấu chấm động nằm ngoài câu hỏi (ví dụ int64_t có độ chính xác cao hơn double có thể biểu diễn mà không có lỗi)

Chúng ta có thể xác định chức năng này như sau:

#include <cmath> 

inline long 
floordiv (long num, long den) 
{ 
    if (0 < (num^den)) 
    return num/den; 
    else 
    { 
     ldiv_t res = ldiv(num,den); 
     return (res.rem)? res.quot-1 
         : res.quot; 
    } 
} 

Ý tưởng là sử dụng số nguyên divison bình thường, nhưng điều chỉnh cho kết quả phủ định để phù hợp với hành vi của hàm double floor(double). Vấn đề là cắt ngắn luôn về phía số nguyên thấp tiếp theo, bất kể vị trí của điểm zero. Điều này có thể rất quan trọng nếu ý định là tạo ra các khoảng thời gian có kích thước.

đo Timing cho thấy chức năng này ở đây chỉ tạo ra một chi phí nhỏ so với built-in / điều hành, nhưng tất nhiên điểm nổi dựa floor chức năng là nhanh hơn đáng kể ....

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