2012-02-04 9 views
138

Tôi có một chương trình trong C++ (được biên dịch bằng g ++). Tôi đang cố gắng để áp dụng hai đôi như toán hạng với chức năng mô đun, nhưng tôi nhận được lỗi sau:Không thể sử dụng mô-đun trên đôi?

error: invalid operands of types 'double' and 'double' to binary 'operator%'

Dưới đây là các mã:

int main() { 
    double x = 6.3; 
    double y = 2; 
    double z = x % y; 
} 
+9

Như đã đề cập, fmod() cung cấp các chức năng cần thiết. Như chưa được lưu ý, điều quan trọng là nhận ra rằng các lỗi làm tròn trong toán hạng thứ hai của 'fmod' có thể gây ra các hành vi không mong muốn. Ví dụ, 'fmod (1, 0,1);' nên toán học bằng không, nhưng thực ra sẽ gần như là 0,1. Mức độ lỗi tăng lên theo độ lớn của thương. Ví dụ, 'fmod (9E14, 0,1);' ước tính khoảng 0,05, mà là từ một quan điểm toán học chỉ đơn giản là sai. – supercat

+1

@supercat biết thêm chi tiết sẽ là tuyệt vời. Tôi nghĩ rằng có một ý tưởng về những gì đằng sau hậu trường để gây ra những gì bạn nói là đúng, nhưng nó sẽ là tốt để xem lý do tại sao những gì bạn nói là đúng; sẽ rất thú vị để xem nó hoạt động như thế nào sau hậu trường (tôi nghĩ rằng tôi hiểu nhưng có thể rất dễ bị sai). – RastaJedi

+2

Giá trị dấu phảy động đại diện cho bội số nguyên chính xác hoặc phân số của các lũy thừa của hai. Ví dụ: 0,1 chữ số nguyên là chính xác 3602879701896397/36028797018963968 (giá trị thứ hai là lũy thừa của hai). 'fmod (x, 0,1)' sẽ chia x cho phân số chính xác đó và lấy phần còn lại, thay vì chia cho giá trị bằng số "một phần mười". – supercat

Trả lời

214

Nhà điều hành % là dành cho số nguyên. Bạn đang tìm kiếm fmod() function.

#include <cmath> 

int main() 
{ 
    double x = 6.3; 
    double y = 2.0; 
    double z = std::fmod(x,y); 

} 
+0

Tôi lập trình bằng C++ cho Qt và fmod có lỗi ở đó. Kết quả của fmod (góc, 360) có thể là 360 (WAT ?!) – Paul

+1

@Paul: Đó có thể không phải là lỗi. Nếu 'góc' là, giả sử, '359.9999999', thì cả hai' góc' và' fmod (góc, 360) 'có thể được hiển thị dưới dạng' 360'. (Thêm nhiều hơn 9 khi cần.) Thử in các giá trị bằng 50 chữ số chính xác. –

33

fmod(x, y) là chức năng bạn sử dụng.

2

Sử dụng fmod() từ <cmath>. Nếu bạn không muốn bao gồm các tập tin header C (lưu ý: U không thể float hoặc double):

template<typename T, typename U> 
constexpr T dmod (T x, U mod) 
{ 
    return !mod ? x : static_cast<long long>(x) % mod + x - static_cast<long long>(x); 
} 

//Usage: 
double z = dmod<double, unsigned int>(14.3, 4); 
double z = dmod<long, short>(14, 4); 
//This also works: 
double z = dmod(14, 4); 
double z = dmod(14, 0); 
double z = dmod(myFirstVariable, someOtherVariable); 
+0

Tại sao bạn không muốn bao gồm tệp tiêu đề C? Đó là những gì nó có cho. –