scoutos / prex0.9.0 / usr / lib / libc / stdlib / div.c @ 03e9c04a
History  View  Annotate  Download (2.71 KB)
1 
/*


2 
* Copyright (c) 1990, 1993

3 
* The Regents of the University of California. All rights reserved.

4 
*

5 
* This code is derived from software contributed to Berkeley by

6 
* Chris Torek.

7 
*

8 
* Redistribution and use in source and binary forms, with or without

9 
* modification, are permitted provided that the following conditions

10 
* are met:

11 
* 1. Redistributions of source code must retain the above copyright

12 
* notice, this list of conditions and the following disclaimer.

13 
* 2. Redistributions in binary form must reproduce the above copyright

14 
* notice, this list of conditions and the following disclaimer in the

15 
* documentation and/or other materials provided with the distribution.

16 
* 3. Neither the name of the University nor the names of its contributors

17 
* may be used to endorse or promote products derived from this software

18 
* without specific prior written permission.

19 
*

20 
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

21 
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

22 
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

23 
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

24 
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

25 
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

26 
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

27 
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

28 
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

29 
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

30 
* SUCH DAMAGE.

31 
*/

32  
33 
#include <stdlib.h> /* div_t */ 
34  
35 
div_t 
36 
div(num, denom) 
37 
int num, denom;

38 
{ 
39 
div_t r; 
40  
41 
r.quot = num / denom; 
42 
r.rem = num % denom; 
43 
/*

44 
* The ANSI standard says that r.quot <= n/d, where

45 
* n/d is to be computed in infinite precision. In other

46 
* words, we should always truncate the quotient towards

47 
* 0, never infinity.

48 
*

49 
* Machine division and remainer may work either way when

50 
* one or both of n or d is negative. If only one is

51 
* negative and r.quot has been truncated towards inf,

52 
* r.rem will have the same sign as denom and the opposite

53 
* sign of num; if both are negative and r.quot has been

54 
* truncated towards inf, r.rem will be positive (will

55 
* have the opposite sign of num). These are considered

56 
* `wrong'.

57 
*

58 
* If both are num and denom are positive, r will always

59 
* be positive.

60 
*

61 
* This all boils down to:

62 
* if num >= 0, but r.rem < 0, we got the wrong answer.

63 
* In that case, to get the right answer, add 1 to r.quot and

64 
* subtract denom from r.rem.

65 
*/

66 
if (num >= 0 && r.rem < 0) { 
67 
r.quot++; 
68 
r.rem = denom; 
69 
} 
70 
return (r);

71 
} 