178acc472SPeter Tyser /* Copyright (C) 1992, 1997 Free Software Foundation, Inc. 278acc472SPeter Tyser This file is part of the GNU C Library. 378acc472SPeter Tyser 4*a53002f4SWolfgang Denk * SPDX-License-Identifier: LGPL-2.0+ 5*a53002f4SWolfgang Denk */ 678acc472SPeter Tyser 778acc472SPeter Tyser typedef struct { 878acc472SPeter Tyser long quot; 978acc472SPeter Tyser long rem; 1078acc472SPeter Tyser } ldiv_t; 1178acc472SPeter Tyser /* Return the `ldiv_t' representation of NUMER over DENOM. */ 1278acc472SPeter Tyser ldiv_t 1378acc472SPeter Tyser ldiv (long int numer, long int denom) 1478acc472SPeter Tyser { 1578acc472SPeter Tyser ldiv_t result; 1678acc472SPeter Tyser 1778acc472SPeter Tyser result.quot = numer / denom; 1878acc472SPeter Tyser result.rem = numer % denom; 1978acc472SPeter Tyser 2078acc472SPeter Tyser /* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where 2178acc472SPeter Tyser NUMER / DENOM is to be computed in infinite precision. In 2278acc472SPeter Tyser other words, we should always truncate the quotient towards 2378acc472SPeter Tyser zero, never -infinity. Machine division and remainer may 2478acc472SPeter Tyser work either way when one or both of NUMER or DENOM is 2578acc472SPeter Tyser negative. If only one is negative and QUOT has been 2678acc472SPeter Tyser truncated towards -infinity, REM will have the same sign as 2778acc472SPeter Tyser DENOM and the opposite sign of NUMER; if both are negative 2878acc472SPeter Tyser and QUOT has been truncated towards -infinity, REM will be 2978acc472SPeter Tyser positive (will have the opposite sign of NUMER). These are 3078acc472SPeter Tyser considered `wrong'. If both are NUM and DENOM are positive, 3178acc472SPeter Tyser RESULT will always be positive. This all boils down to: if 3278acc472SPeter Tyser NUMER >= 0, but REM < 0, we got the wrong answer. In that 3378acc472SPeter Tyser case, to get the right answer, add 1 to QUOT and subtract 3478acc472SPeter Tyser DENOM from REM. */ 3578acc472SPeter Tyser 3678acc472SPeter Tyser if (numer >= 0 && result.rem < 0) 3778acc472SPeter Tyser { 3878acc472SPeter Tyser ++result.quot; 3978acc472SPeter Tyser result.rem -= denom; 4078acc472SPeter Tyser } 4178acc472SPeter Tyser 4278acc472SPeter Tyser return result; 4378acc472SPeter Tyser } 44