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