1*78acc472SPeter Tyser /* Copyright (C) 1992, 1997 Free Software Foundation, Inc. 2*78acc472SPeter Tyser This file is part of the GNU C Library. 3*78acc472SPeter Tyser 4*78acc472SPeter Tyser The GNU C Library is free software; you can redistribute it and/or 5*78acc472SPeter Tyser modify it under the terms of the GNU Library General Public License as 6*78acc472SPeter Tyser published by the Free Software Foundation; either version 2 of the 7*78acc472SPeter Tyser License, or (at your option) any later version. 8*78acc472SPeter Tyser 9*78acc472SPeter Tyser The GNU C Library is distributed in the hope that it will be useful, 10*78acc472SPeter Tyser but WITHOUT ANY WARRANTY; without even the implied warranty of 11*78acc472SPeter Tyser MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12*78acc472SPeter Tyser Library General Public License for more details. 13*78acc472SPeter Tyser 14*78acc472SPeter Tyser You should have received a copy of the GNU Library General Public 15*78acc472SPeter Tyser License along with the GNU C Library; see the file COPYING.LIB. If not, 16*78acc472SPeter Tyser write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17*78acc472SPeter Tyser Boston, MA 02111-1307, USA. */ 18*78acc472SPeter Tyser 19*78acc472SPeter Tyser typedef struct { 20*78acc472SPeter Tyser long quot; 21*78acc472SPeter Tyser long rem; 22*78acc472SPeter Tyser } ldiv_t; 23*78acc472SPeter Tyser /* Return the `ldiv_t' representation of NUMER over DENOM. */ 24*78acc472SPeter Tyser ldiv_t 25*78acc472SPeter Tyser ldiv (long int numer, long int denom) 26*78acc472SPeter Tyser { 27*78acc472SPeter Tyser ldiv_t result; 28*78acc472SPeter Tyser 29*78acc472SPeter Tyser result.quot = numer / denom; 30*78acc472SPeter Tyser result.rem = numer % denom; 31*78acc472SPeter Tyser 32*78acc472SPeter Tyser /* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where 33*78acc472SPeter Tyser NUMER / DENOM is to be computed in infinite precision. In 34*78acc472SPeter Tyser other words, we should always truncate the quotient towards 35*78acc472SPeter Tyser zero, never -infinity. Machine division and remainer may 36*78acc472SPeter Tyser work either way when one or both of NUMER or DENOM is 37*78acc472SPeter Tyser negative. If only one is negative and QUOT has been 38*78acc472SPeter Tyser truncated towards -infinity, REM will have the same sign as 39*78acc472SPeter Tyser DENOM and the opposite sign of NUMER; if both are negative 40*78acc472SPeter Tyser and QUOT has been truncated towards -infinity, REM will be 41*78acc472SPeter Tyser positive (will have the opposite sign of NUMER). These are 42*78acc472SPeter Tyser considered `wrong'. If both are NUM and DENOM are positive, 43*78acc472SPeter Tyser RESULT will always be positive. This all boils down to: if 44*78acc472SPeter Tyser NUMER >= 0, but REM < 0, we got the wrong answer. In that 45*78acc472SPeter Tyser case, to get the right answer, add 1 to QUOT and subtract 46*78acc472SPeter Tyser DENOM from REM. */ 47*78acc472SPeter Tyser 48*78acc472SPeter Tyser if (numer >= 0 && result.rem < 0) 49*78acc472SPeter Tyser { 50*78acc472SPeter Tyser ++result.quot; 51*78acc472SPeter Tyser result.rem -= denom; 52*78acc472SPeter Tyser } 53*78acc472SPeter Tyser 54*78acc472SPeter Tyser return result; 55*78acc472SPeter Tyser } 56