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

orl*_*rlp 7 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);
Run Code Online (Sandbox Code Playgroud)

remquo函数计算剩余相同的remainder功能.在由quo指向的对象中,它们存储一个值,其符号是符号,x/y并且其大小是等于2 ^ n 的整数商的大小的模数x/y,其中 n是大于或等于3的实现定义的整数.

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

我理解它返回什么,它返回fmod(x, y),但我不明白整个quo部分.它在语义上是否与此相同?

*quo = (int) x/y;
*quo %= n; /* n implementation defined */
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*eld 7

它似乎很清楚,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
Run Code Online (Sandbox Code Playgroud)

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

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

无论如何,这不是"语言法律".规范告诉你一些非常具体的东西.

  • 我必须承认你是对的。返回的“ quo”看起来毫无用处,尽管[此答案](http://lists.apple.com/archives/carbon-dev/2007/Dec/msg00354.html)有点解释了它的目的。 (2认同)

小智 5

remquo()的典型用法是减少三角函数参数。商的最后3位将使人知道一个角度在归一化模Pi / 4之后的哪个半象限,并在[0,Pi / 4)时间间隔(新的触发功能可能有所不同)。后者通常通过Pade近似计算。


ugo*_*ren 4

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

它相当于(取决于类型差异):

quo = x/y;
rem = x%y;
Run Code Online (Sandbox Code Playgroud)

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

  • 这是编程语言律师的谈话,很难读。它基本上意味着“等于 x/y”,但允许整数溢出。 (2认同)