xref: /haiku/src/libs/mapm/mapm_flr.c (revision 59d799dabcba86f92658ddb402f634e262d9aae7)
1 
2 /*
3  *  M_APM  -  mapm_flr.c
4  *
5  *  Copyright (C) 2001 - 2007   Michael C. Ring
6  *
7  *  Permission to use, copy, and distribute this software and its
8  *  documentation for any purpose with or without fee is hereby granted,
9  *  provided that the above copyright notice appear in all copies and
10  *  that both that copyright notice and this permission notice appear
11  *  in supporting documentation.
12  *
13  *  Permission to modify the software is granted. Permission to distribute
14  *  the modified code is granted. Modifications are to be distributed by
15  *  using the file 'license.txt' as a template to modify the file header.
16  *  'license.txt' is available in the official MAPM distribution.
17  *
18  *  This software is provided "as is" without express or implied warranty.
19  */
20 
21 /*
22  *      $Id: mapm_flr.c,v 1.4 2007/12/03 01:39:12 mike Exp $
23  *
24  *      This file contains the floor and ceil functions
25  *
26  *      $Log: mapm_flr.c,v $
27  *      Revision 1.4  2007/12/03 01:39:12  mike
28  *      Update license
29  *
30  *      Revision 1.3  2002/11/05 23:25:30  mike
31  *      use new set_to_zero function instead of copy
32  *
33  *      Revision 1.2  2002/11/03 21:47:43  mike
34  *      Updated function parameters to use the modern style
35  *
36  *      Revision 1.1  2001/03/25 20:53:29  mike
37  *      Initial revision
38  */
39 
40 #include "m_apm_lc.h"
41 
42 /*
43  *      input    floor    ceil
44  *	-----	------	 ------
45  *      329.0    329.0    329.0
46  *     -837.0   -837.0   -837.0
47  *	372.64   372.0    373.0
48  *     -237.52  -238.0   -237.0
49  */
50 
51 /****************************************************************************/
52 /*
53  *      return the nearest integer <= input
54  */
m_apm_floor(M_APM bb,M_APM aa)55 void	m_apm_floor(M_APM bb, M_APM aa)
56 {
57 M_APM	mtmp;
58 
59 m_apm_copy(bb, aa);
60 
61 if (m_apm_is_integer(bb))          /* if integer, we're done */
62   return;
63 
64 if (bb->m_apm_exponent <= 0)       /* if |bb| < 1, result is -1 or 0 */
65   {
66    if (bb->m_apm_sign < 0)
67      m_apm_negate(bb, MM_One);
68    else
69      M_set_to_zero(bb);
70 
71    return;
72   }
73 
74 if (bb->m_apm_sign < 0)
75   {
76    mtmp = M_get_stack_var();
77    m_apm_negate(mtmp, bb);
78 
79    mtmp->m_apm_datalength = mtmp->m_apm_exponent;
80    M_apm_normalize(mtmp);
81 
82    m_apm_add(bb, mtmp, MM_One);
83    bb->m_apm_sign = -1;
84    M_restore_stack(1);
85   }
86 else
87   {
88    bb->m_apm_datalength = bb->m_apm_exponent;
89    M_apm_normalize(bb);
90   }
91 }
92 /****************************************************************************/
93 /*
94  *      return the nearest integer >= input
95  */
m_apm_ceil(M_APM bb,M_APM aa)96 void	m_apm_ceil(M_APM bb, M_APM aa)
97 {
98 M_APM	mtmp;
99 
100 m_apm_copy(bb, aa);
101 
102 if (m_apm_is_integer(bb))          /* if integer, we're done */
103   return;
104 
105 if (bb->m_apm_exponent <= 0)       /* if |bb| < 1, result is 0 or 1 */
106   {
107    if (bb->m_apm_sign < 0)
108      M_set_to_zero(bb);
109    else
110      m_apm_copy(bb, MM_One);
111 
112    return;
113   }
114 
115 if (bb->m_apm_sign < 0)
116   {
117    bb->m_apm_datalength = bb->m_apm_exponent;
118    M_apm_normalize(bb);
119   }
120 else
121   {
122    mtmp = M_get_stack_var();
123    m_apm_copy(mtmp, bb);
124 
125    mtmp->m_apm_datalength = mtmp->m_apm_exponent;
126    M_apm_normalize(mtmp);
127 
128    m_apm_add(bb, mtmp, MM_One);
129    M_restore_stack(1);
130   }
131 }
132 /****************************************************************************/
133