通过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函数返回xREMy.如果y为零,则存储在指向的对象中的值quo未指定,并且是否发生域错误或函数返回零是实现定义的.
我理解它返回什么,它返回fmod(x, y),但我不明白整个quo部分.它在语义上是否与此相同?
*quo = (int) x/y;
*quo %= n; /* n implementation defined */
Run Code Online (Sandbox Code Playgroud)
我的最后一个问题是,这个功能有用吗?
它似乎很清楚,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.所以你能做的最好的事情就是给出一些低位.
无论如何,这不是"语言法律".规范告诉你一些非常具体的东西.
小智 5
remquo()的典型用法是减少三角函数参数。商的最后3位将使人知道一个角度在归一化模Pi / 4之后的哪个半象限,并在[0,Pi / 4)时间间隔(新的触发功能可能有所不同)。后者通常通过Pade近似计算。
编辑:正如 Jeffrey Scofield 在他的回答中所说,返回的商实际上不是x/y,而是商的低 3 位(加号)。
它相当于(取决于类型差异):
quo = x/y;
rem = x%y;
Run Code Online (Sandbox Code Playgroud)
其中rem是返回值,quo作为输出参数返回。
与上述语法相比,它的优点是它只执行一次除法运算。
| 归档时间: |
|
| 查看次数: |
1341 次 |
| 最近记录: |