Generic div.c.
[kopensolaris-gnu/glibc.git] / stdlib / div.c
1 /* Copyright (C) 1992, 1997, 1999 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 /*
20  * Copyright (c) 1990 Regents of the University of California.
21  * All rights reserved.
22  *
23  * This code is derived from software contributed to Berkeley by
24  * Chris Torek.
25  *
26  * Redistribution and use in source and binary forms, with or without
27  * modification, are permitted provided that the following conditions
28  * are met:
29  * 1. Redistributions of source code must retain the above copyright
30  *    notice, this list of conditions and the following disclaimer.
31  * 2. Redistributions in binary form must reproduce the above copyright
32  *    notice, this list of conditions and the following disclaimer in the
33  *    documentation and/or other materials provided with the distribution.
34  * 4. Neither the name of the University nor the names of its contributors
35  *    may be used to endorse or promote products derived from this software
36  *    without specific prior written permission.
37  *
38  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
39  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
41  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
42  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
43  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
44  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
45  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
46  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
47  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  */
50
51 #include <stdlib.h>
52
53 /* Return the `div_t' representation of NUMER over DENOM.  */
54 div_t
55 div (numer, denom)
56      int numer, denom;
57 {
58   div_t result;
59
60   result.quot = numer / denom;
61   result.rem = numer % denom;
62
63   /* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where
64      NUMER / DENOM is to be computed in infinite precision.  In
65      other words, we should always truncate the quotient towards
66      zero, never -infinity.  Machine division and remainer may
67      work either way when one or both of NUMER or DENOM is
68      negative.  If only one is negative and QUOT has been
69      truncated towards -infinity, REM will have the same sign as
70      DENOM and the opposite sign of NUMER; if both are negative
71      and QUOT has been truncated towards -infinity, REM will be
72      positive (will have the opposite sign of NUMER).  These are
73      considered `wrong'.  If both are NUM and DENOM are positive,
74      RESULT will always be positive.  This all boils down to: if
75      NUMER >= 0, but REM < 0, we got the wrong answer.  In that
76      case, to get the right answer, add 1 to QUOT and subtract
77      DENOM from REM.  */
78
79   if (numer >= 0 && result.rem < 0)
80     {
81       ++result.quot;
82       result.rem -= denom;
83     }
84
85   return result;
86 }