函数remquo做了什么以及它可以用于什么?

时间:2012-02-19 14:21:56

标签: c function

通过C规范阅读我发现了这个功能:

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);
  

remquo 函数计算与 remainder 函数相同的余数。在   他们指出的对象存储了一个值,其值是 x/y 的符号,其符号为   幅度是全等模 2 ^ n   到 x/y 的整数商数的大小,其中    n 是一个大于或等于3的实现定义整数。

     

remquo 函数返回 x REM y 。如果 y 为零,则存储在对象中的值    quo 指向的是未指定的,是否发生域错误或功能   返回零是实现定义。

我理解它返回的内容,它返回fmod(x, y),但我不理解整个quo部分。它在语义上是否与此相同?

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

我的最后一个问题是,这项功能有用吗?

3 个答案:

答案 0 :(得分:6)

很明显remquo 给出x / y的值。它只给出了商的一些低位。这是一个例子:

#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

对于OS X 10.8.2(Xcode 4.6)和Linux系统,我得到了相同的答案。满商是29629,5是它的低3位。

值得注意的是,商很容易太大而无法表示为int。所以你能做的最好就是给一些低位。

无论如何,这不是“语言法”。规范告诉你一些非常具体的事情。

答案 1 :(得分:4)

remquo()的典型用法是减少三角函数参数。商的最后3位将允许人们在减少模Pi / 4之后判断角度所在的半象限,并且将原始触发调用转换为[0,Pi /中的角度内的另一个触发调用。 4)间隔(新的trig函数可能不同)。后者通常通过Pade近似计算。

答案 2 :(得分:2)

编辑:正如Jeffrey Scofield在his answer中所说,返回的商实际上不是x/y,而是商的低3位(加号)。 / p>

它等同于(类型差异):

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

其中rem是返回值,quo作为输出参数返回 它优于上述语法的优点是它只进行一次除法运算。