00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00025 # ifdef HAVE_CONFIG_H
00026 # include "config.h"
00027 # endif
00028
00029 # include "global.h"
00030
00031 # include "fixed.h"
00032
00036 mad_fixed_t mad_f_abs(mad_fixed_t x)
00037 {
00038 return x < 0 ? -x : x;
00039 }
00040
00044 mad_fixed_t mad_f_div(mad_fixed_t x, mad_fixed_t y)
00045 {
00046 mad_fixed_t q, r;
00047 unsigned int bits;
00048
00049 q = mad_f_abs(x / y);
00050
00051 if (x < 0) {
00052 x = -x;
00053 y = -y;
00054 }
00055
00056 r = x % y;
00057
00058 if (y < 0) {
00059 x = -x;
00060 y = -y;
00061 }
00062
00063 if (q > mad_f_intpart(MAD_F_MAX) &&
00064 !(q == -mad_f_intpart(MAD_F_MIN) && r == 0 && (x < 0) != (y < 0)))
00065 return 0;
00066
00067 for (bits = MAD_F_FRACBITS; bits && r; --bits) {
00068 q <<= 1, r <<= 1;
00069 if (r >= y)
00070 r -= y, ++q;
00071 }
00072
00073
00074 if (2 * r >= y)
00075 ++q;
00076
00077
00078 if ((x < 0) != (y < 0))
00079 q = -q;
00080
00081 return q << bits;
00082 }