14 
roytam 
1 
/* 


2 
* libmad  MPEG audio decoder library 
26 
roytam 
3 
* Copyright (C) 20002004 Underbit Technologies, Inc. 
14 
roytam 
4 
* 


5 
* This program is free software; you can redistribute it and/or modify 


6 
* it under the terms of the GNU General Public License as published by 


7 
* the Free Software Foundation; either version 2 of the License, or 


8 
* (at your option) any later version. 


9 
* 


10 
* This program is distributed in the hope that it will be useful, 


11 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 


12 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 


13 
* GNU General Public License for more details. 


14 
* 


15 
* You should have received a copy of the GNU General Public License 


16 
* along with this program; if not, write to the Free Software 


17 
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 021111307 USA 


18 
* 
26 
roytam 
19 
* $Id: fixed.c,v 1.13 2004/01/23 09:41:32 rob Exp $ 
14 
roytam 
20 
*/ 


21 



22 
# ifdef HAVE_CONFIG_H 


23 
# include "config.h" 


24 
# endif 


25 



26 
# include "global.h" 


27 



28 
# include "fixed.h" 


29 



30 
/* 


31 
* NAME: fixed>abs() 


32 
* DESCRIPTION: return absolute value of a fixedpoint number 


33 
*/ 


34 
mad_fixed_t mad_f_abs(mad_fixed_t x) 


35 
{ 


36 
return x < 0 ? x : x; 


37 
} 


38 



39 
/* 


40 
* NAME: fixed>div() 


41 
* DESCRIPTION: perform division using fixedpoint math 


42 
*/ 


43 
mad_fixed_t mad_f_div(mad_fixed_t x, mad_fixed_t y) 


44 
{ 


45 
mad_fixed_t q, r; 


46 
unsigned int bits; 


47 



48 
q = mad_f_abs(x / y); 


49 



50 
if (x < 0) { 


51 
x = x; 


52 
y = y; 


53 
} 


54 



55 
r = x % y; 


56 



57 
if (y < 0) { 


58 
x = x; 


59 
y = y; 


60 
} 


61 



62 
if (q > mad_f_intpart(MAD_F_MAX) && 


63 
!(q == mad_f_intpart(MAD_F_MIN) && r == 0 && (x < 0) != (y < 0))) 


64 
return 0; 


65 



66 
for (bits = MAD_F_FRACBITS; bits && r; bits) { 


67 
q <<= 1, r <<= 1; 


68 
if (r >= y) 


69 
r = y, ++q; 


70 
} 


71 



72 
/* round */ 


73 
if (2 * r >= y) 


74 
++q; 


75 



76 
/* fix sign */ 


77 
if ((x < 0) != (y < 0)) 


78 
q = q; 


79 



80 
return q << bits; 


81 
} 