通过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
REMy
。如果y
为零,则存储在对象中的值quo
指向的是未指定的,是否发生域错误或功能 返回零是实现定义。
我理解它返回的内容,它返回fmod(x, y)
,但我不理解整个quo
部分。它在语义上是否与此相同?
*quo = (int) x/y;
*quo %= n; /* n implementation defined */
我的最后一个问题是,这项功能有用吗?
答案 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
作为输出参数返回
它优于上述语法的优点是它只进行一次除法运算。