Back to index

glibc  2.9
div.c
Go to the documentation of this file.
00001 /* Copyright (C) 1992, 1997, 1999 Free Software Foundation, Inc.
00002    This file is part of the GNU C Library.
00003 
00004    The GNU C Library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Lesser General Public
00006    License as published by the Free Software Foundation; either
00007    version 2.1 of the License, or (at your option) any later version.
00008 
00009    The GNU C Library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Lesser General Public License for more details.
00013 
00014    You should have received a copy of the GNU Lesser General Public
00015    License along with the GNU C Library; if not, write to the Free
00016    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00017    02111-1307 USA.  */
00018 
00019 /*
00020  * Copyright (c) 1990 Regents of the University of California.
00021  * All rights reserved.
00022  *
00023  * This code is derived from software contributed to Berkeley by
00024  * Chris Torek.
00025  *
00026  * Redistribution and use in source and binary forms, with or without
00027  * modification, are permitted provided that the following conditions
00028  * are met:
00029  * 1. Redistributions of source code must retain the above copyright
00030  *    notice, this list of conditions and the following disclaimer.
00031  * 2. Redistributions in binary form must reproduce the above copyright
00032  *    notice, this list of conditions and the following disclaimer in the
00033  *    documentation and/or other materials provided with the distribution.
00034  * 4. Neither the name of the University nor the names of its contributors
00035  *    may be used to endorse or promote products derived from this software
00036  *    without specific prior written permission.
00037  *
00038  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
00039  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00040  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00041  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
00042  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00043  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00044  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00045  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00046  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00047  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00048  * SUCH DAMAGE.
00049  */
00050 
00051 #include <stdlib.h>
00052 
00053 /* Return the `div_t' representation of NUMER over DENOM.  */
00054 div_t
00055 div (numer, denom)
00056      int numer, denom;
00057 {
00058   div_t result;
00059 
00060   result.quot = numer / denom;
00061   result.rem = numer % denom;
00062 
00063   /* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where
00064      NUMER / DENOM is to be computed in infinite precision.  In
00065      other words, we should always truncate the quotient towards
00066      zero, never -infinity.  Machine division and remainer may
00067      work either way when one or both of NUMER or DENOM is
00068      negative.  If only one is negative and QUOT has been
00069      truncated towards -infinity, REM will have the same sign as
00070      DENOM and the opposite sign of NUMER; if both are negative
00071      and QUOT has been truncated towards -infinity, REM will be
00072      positive (will have the opposite sign of NUMER).  These are
00073      considered `wrong'.  If both are NUM and DENOM are positive,
00074      RESULT will always be positive.  This all boils down to: if
00075      NUMER >= 0, but REM < 0, we got the wrong answer.  In that
00076      case, to get the right answer, add 1 to QUOT and subtract
00077      DENOM from REM.  */
00078 
00079   if (numer >= 0 && result.rem < 0)
00080     {
00081       ++result.quot;
00082       result.rem -= denom;
00083     }
00084 
00085   return result;
00086 }