22 #if defined (CS_IEEE_DOUBLE_FORMAT)
107 # define CS_LOWER_WORD_BYTE 4
109 # define CS_LOWER_WORD_BYTE 0
112 #define CS_LONG_AT_BYTE(x,b) *(long *)(((char *)&x) + b)
120 #define FIST_MAGIC_QINT (65536.0 * 65536.0 * 16.0)
128 #ifdef CS_QINT_WORKAROUND
129 static inline long QInt (
double inval)
131 union {
double dtemp;
long result; }
x;
133 x.dtemp = FIST_MAGIC_QINT + inval;
134 x.result = CS_LONG_AT_BYTE (
x.dtemp, 2);
135 return x.result < 0 ? (
x.result >> 1) + 1 :
x.result;
138 static inline long QInt (
double inval)
140 double dtemp = FIST_MAGIC_QINT + inval;
143 long result = CS_LONG_AT_BYTE (dtemp, 2);
144 return result < 0 ? (result >> 1) + 1 : result;
152 #define FIST_MAGIC_QROUND (((65536.0 * 65536.0 * 16.0) + (65536.0 * 0.5)) * 65536.0)
155 static inline long QRound (
double inval)
157 double dtemp = FIST_MAGIC_QROUND + inval;
158 return CS_LONG_AT_BYTE (dtemp, CS_LOWER_WORD_BYTE) - 0x80000000;
165 #define FIST_MAGIC_QINT8 (((65536.0 * 16.0) + 0.5) * 65536.0 * 256.0)
168 inline long QInt8 (
float inval)
170 double dtemp = FIST_MAGIC_QINT8 + inval;
171 return CS_LONG_AT_BYTE (dtemp, CS_LOWER_WORD_BYTE) - 0x80000000;
178 #define FIST_MAGIC_QINT16 (((65536.0 * 16.0) + 0.5) * 65536.0)
181 inline long QInt16 (
float inval)
183 double dtemp = FIST_MAGIC_QINT16 + inval;
184 return CS_LONG_AT_BYTE (dtemp, CS_LOWER_WORD_BYTE) - 0x80000000;
191 #define FIST_MAGIC_QINT24 (((65536.0 * 16.0) + 0.5) * 256.0)
193 inline long QInt24 (
float inval)
195 double dtemp = FIST_MAGIC_QINT24 + inval;
196 return CS_LONG_AT_BYTE (dtemp, CS_LOWER_WORD_BYTE) - 0x80000000;
201 #define QRound(x) (int ((x) + ((x < 0) ? -0.5 : +0.5)))
202 #define QInt(x) (int (x))
203 #define QInt8(x) (int ((x)*256.))
204 #define QInt16(x) (int ((x)*65536.))
205 #define QInt24(x) (int ((x)*16777216.))