Что делает функция remquo и для чего ее можно использовать? - PullRequest
6 голосов
/ 19 февраля 2012

Читая спецификации 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 ]

6 голосов
/ 01 мая 2013

Кажется довольно ясным, что 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. Так что на самом деле лучшее, что вы можете сделать, это дать несколько младших битов.

Во всяком случае, это не «языковая законность». Спецификация говорит вам кое-что довольно конкретное.

4 голосов
/ 19 июня 2014

Типичное использование remquo () - сокращение аргументов функции тригонометрии.Последние 3 бита отношения позволили бы определить, в каком полуквадранте находится угол, после уменьшения по модулю Pi / 4, и преобразовать исходный триггерный вызов в другой триговой вызов по углу в пределах [0, Pi /4) интервал (новая функция триггера может быть другой).Последний обычно вычисляется с помощью приближения Паде.

2 голосов
/ 19 февраля 2012

РЕДАКТИРОВАТЬ: Как сказал Джеффри Скофилд в своем ответе , возвращаемое частное действительно не x/y, а младшие 3 бита (знак плюс) частного.

Это эквивалентно (до различий в типах):

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

Где rem - возвращаемое значение, а quo - в качестве выходного параметра.
Его преимущество перед приведенным выше синтаксисом состоит в том, что он выполняет только одну операцию деления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...