glibc
2.9

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 021111307 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 }