2012-02-19 34 views
5

Đọc qua các thông số kỹ thuật C Tôi tìm thấy chức năng này:Chức năng remquo làm gì và nó có thể được sử dụng để làm gì?

double remquo(double x, double y, int *quo); 
float remquof(float x, float y, int *quo); 
long double remquol(long double x, long double y, 
    int *quo); 

Các remquo chức năng tính toán thời gian còn lại tương tự như remainder chức năng. Trong đối tượng được trỏ đến bởi hiện họ lưu trữ một giá trị có dấu hiệu là dấu hiệu của x/y và có độ lớn là đồng dư modulo 2^n đến tầm quan trọng của thương không thể thiếu của x/y, nơi n là một thực-de fi nguyên ned lớn hơn hoặc bằng 3.

Các remquo chức năng trở x REM y. Nếu y là zero, giá trị được lưu trữ trong đối tượng trỏ đến bởi quo là unspeci fi ed và liệu một lỗi xảy ra miền hoặc các chức năng trở zero là thi de fi Ned.

Tôi hiểu những gì nó trả về, nó trả về fmod(x, y), nhưng tôi không hiểu toàn bộ phần quo. Nó có bằng ngữ nghĩa không?

*quo = (int) x/y; 
*quo %= n; /* n implementation defined */ 

Và câu hỏi cuối cùng của tôi, cho chức năng này có ích gì?

+0

cũng xem http://www.kernel.org/doc/man-pages/online/pages/man3/remquo.3.html và http://sourceware.org/bugzilla/show_bug.cgi?id=4449 – Christoph

+0

Cách sử dụng đã được trả lời trong [câu hỏi này] (http://stackoverflow.com/questions/11074865/stdremquo-purpose-and-usage) –

+1

Cũng là một lưu ý từ [cppreference] (http://en.cppreference.com/ w/cpp/số/math/remquo): Hàm này hữu ích khi thực hiện các hàm định kỳ với khoảng thời gian chính xác có thể biểu diễn dưới dạng giá trị dấu phẩy động: khi tính sin (πx) cho x rất lớn, gọi std :: sin trực tiếp dẫn đến lỗi lớn, nhưng nếu đối số hàm lần đầu tiên được giảm với std :: remquo, các bit có thứ tự thấp của thương có thể được sử dụng để xác định dấu và octant của kết quả trong khoảng thời gian, còn lại có thể là được sử dụng để tính giá trị với độ chính xác cao. –

Trả lời

2

CHỈNH SỬA: Như Jeffrey Scofield cho biết trong his answer, thương hiệu trả lại thực sự không phải là x/y, nhưng 3 bit thấp (dấu cộng) của thương.

Đó là tương đương với (lên đến gõ khác biệt):

quo = x/y; 
rem = x%y; 

đâu rem là giá trị trả về, và quo được trả về như một tham số đầu ra.
Lợi thế của nó so với cú pháp trên là nó chỉ hoạt động một bộ phận.

+1

ugoren: phần này là gì? 'và có độ lớn là đồng đẳng modulo 2^n đến độ lớn của thương số tích phân của x/y, trong đó n là một số nguyên thực hiện lớn hơn hoặc bằng 3.' – orlp

+2

Đó là ngôn ngữ lập trình luật sư nói chuyện, khá khó để đọc. Về cơ bản nó có nghĩa là "bằng x/y", nhưng cho phép tràn một số nguyên. – ugoren

+1

@ugoran: Vì '2^3 == 8' tôi cho rằng điều này là để cho phép điều này làm việc trên các triển khai trong đó' sizeof (int) == 1 byte'. Nhưng tại sao họ không ép buộc 'n == sizeof (int)'? – orlp

5

Có vẻ như khá rõ ràng rằng remquo không không cho giá trị x/y. Nó chỉ cho một vài bit thấp của thương. Dưới đây là ví dụ:

#define _ISOC99_SOURCE 
#include <stdio.h> 
#include <math.h> 

int main() 
{ 
    int quo; 
    double res = remquo(88888.0, 3.0, &quo); 
    printf("%f %d\n", res, quo); 
    return 0; 
} 
$ 
$ cc -o rq rq.c 
$ rq 
1.000000 5 

Tôi nhận được câu trả lời tương tự cho OS X 10.8.2 (Xcode 4.6) và trên hệ thống Linux. Toàn bộ thương là 29629 và 5 là 3 bit thấp.

Cần lưu ý rằng thương có thể rất dễ dàng quá lớn để được biểu diễn dưới dạng int. Vì vậy, thực sự tốt nhất bạn có thể làm là để cung cấp cho một số bit thấp.

Dù sao, đây không phải là "luật sư ngôn ngữ". Các đặc điểm kỹ thuật là nói cho bạn một cái gì đó khá cụ thể.

+1

Tôi phải thừa nhận rằng bạn đúng. Trả về 'quo' trông khá vô ích, mặc dù [câu trả lời này] (http://lists.apple.com/archives/carbon-dev/2007/Dec/msg00354.html) giải thích mục đích của nó một chút. – ugoren

2

Cách sử dụng điển hình của remquo() là giảm đối số hàm lượng giác. 3 bit cuối cùng của thương số sẽ cho phép người ta biết góc bán phần góc nào, sau khi giảm modulo Pi/4, và chuyển đổi cuộc gọi trig ban đầu sang một cuộc gọi trig khác trên một góc trong [0, Pi/4) khoảng thời gian (chức năng trig mới có thể khác nhau). Cái sau thường được tính thông qua một xấp xỉ Pade.

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