Funkcja div() zwraca strukturę, która zawiera iloraz i pozostałość podziału pierwszego parametru (licznika) o sekundę (mianownik). Istnieją cztery warianty:
div_t div(int, int)
ldiv_t ldiv(long, long)
lldiv_t lldiv(long long, long long)
imaxdiv_t imaxdiv(intmax_t, intmax_t
(intmax_t reprezentuje największy typ całkowitą dostępną w systemie)
Struktura div_t
wygląda tak:
typedef struct
{
int quot; /* Quotient. */
int rem; /* Remainder. */
} div_t;
Implementacja używa po prostu operatorów /
i %
, więc nie jest to funkcja bardzo skomplikowana lub niezbędna, ale jest częścią standardu C (zdefiniowanego przez [ISO 9899: 201x] [1]).
Zobacz wdrożenie w LIBC:
/* Return the `div_t' representation of NUMER over DENOM. */
div_t
div (numer, denom)
int numer, denom;
{
div_t result;
result.quot = numer/denom;
result.rem = numer % denom;
/* The ANSI standard says that |QUOT| <= |NUMER/DENOM|, where
NUMER/DENOM is to be computed in infinite precision. In
other words, we should always truncate the quotient towards
zero, never -infinity. Machine division and remainer may
work either way when one or both of NUMER or DENOM is
negative. If only one is negative and QUOT has been
truncated towards -infinity, REM will have the same sign as
DENOM and the opposite sign of NUMER; if both are negative
and QUOT has been truncated towards -infinity, REM will be
positive (will have the opposite sign of NUMER). These are
considered `wrong'. If both are NUM and DENOM are positive,
RESULT will always be positive. This all boils down to: if
NUMER >= 0, but REM < 0, we got the wrong answer. In that
case, to get the right answer, add 1 to QUOT and subtract
DENOM from REM. */
if (numer >= 0 && result.rem < 0)
{
++result.quot;
result.rem -= denom;
}
return result;
}
Odpowiedź na to pytanie została już udzielona w [to pytanie] (http://stackoverflow.com/a/11726016/995714) –