2011-09-21 60 views
7

Khi tôi sử dụng toán tử% trên các giá trị float, tôi nhận được lỗi nói rằng "toán hạng không hợp lệ thành nhị phân% (có 'float' và 'double')". giá trị chỉ nhưng số lượng rất lớn (không phải trong phạm vi của loại int) để tránh sự bất tiện tôi sử dụng float.Is có cách nào để sử dụng toán tử% trên các giá trị số nguyên lớn như vậy ????Cách sử dụng% toán tử cho các giá trị float trong c

+0

Vì vậy, 1,5% 1,1 = 0,4? – StuartLC

+0

vâng phân chia modulo a = b% c; sẽ không hoạt động, bởi vì bạn không thể nhận được phần còn lại bằng cách chia một số thập phân cho một số thập phân. –

Trả lời

11

Bạn có thể sử dụng hàm fmod từ thư viện toán chuẩn. Nguyên mẫu của nó nằm trong tiêu đề chuẩn <math.h>.

+2

+1 ... nhưng liên kết tới [fmod] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fmod.html) sẽ rất tuyệt :) – pmg

+1

@pmg: Đó không phải là lý do chúng tôi được phép chỉnh sửa bài đăng của người khác? :) –

+0

@ssg: chắc chắn! – cyco130

5

Có lẽ bạn nên sử dụng long long, có độ chính xác cao hơn double ở hầu hết các hệ thống.

Lưu ý: Nếu số của bạn lớn hơn long long có thể giữ, thì fmod có thể sẽ không hoạt động theo cách bạn muốn. Trong trường hợp đó, đặt cược tốt nhất của bạn là thư viện bigint, chẳng hạn như this one.

+0

BigIntegerLibrary không được chấp nhận trong c ??? Hơn nữa, số% specifier cho số nguyên lớn ??? –

+0

Xin lỗi, thư viện tôi đề xuất là C++. –

0

xem xét: int 32 bit và int lâu dài của 64 bit

Vâng,% (modulo) điều hành không được làm việc với phao nổi và đôi .. nếu bạn muốn làm các phép toán module trên số lượng lớn bạn có thể kiểm tra long long int(64bits) điều này có thể giúp bạn.

vẫn là phạm vi vắt hơn 64 bit trong trường hợp đó, bạn cần lưu trữ dữ liệu trong chuỗi .. và thực hiện thao tác modulo theo thuật toán.

hoặc một trong hai bạn có thể đi đến bất kỳ ngôn ngữ kịch bản như trăn

4

Nhà điều hành % chỉ được định nghĩa cho kiểu dữ liệu integer toán hạng; bạn sẽ cần phải sử dụng các chức năng thư viện fmod* với nhiều loại dấu chấm động:

#include <math.h> 
double fmod(double x, double y); 
float fmodf(float x, float y); 
long double fmodl(long double x, long double y); 
0

Nếu bạn muốn sử dụng việc sử dụng int lâu dài, không sử dụng một định dạng đó là phi lý tưởng cho vấn đề của bạn nếu một định dạng tốt hơn tồn tại.

0

Khi tôi đã không có dễ dàng truy cập vào fmod hoặc các thư viện khác (ví dụ, làm một Arduino phác thảo nhanh), tôi thấy rằng các công trình sau đây cũng đủ:

float someValue = 0.0; 

// later... 

// Since someValue = (someValue + 1) % 256 won't work for floats... 
someValue += 1.0; // (or whatever increment you want to use) 
while (someValue >= 256.0){ 
    someValue -= 256.0; 
} 
Các vấn đề liên quan