Probaste si para todos los numeros es asi ?
#define Q15(X) \
((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))
#if DATA_TYPE==FLOATING /* [ */
#define Float2Fract(aVal) (aVal) /* Identity function */
#define Fract2Float(aVal) (aVal) /* Identity function */
#else /* ] */
extern fractional Float2Fract ( /* Converts float into fractional */
float aVal /* float value in range [-1, 1) */
);
extern float Fract2Float ( /* Converts fractional into float */
fractional aVal /* fract value in range {-1, 1-2^-15} */
);
#endif /* ] */
Disculpa pero no entiendo nada de C,, imaginare q la funcion Q15 es la que realiza esa conversion... A simple vista se puede ver que hace una restas o suma dependiendo del signo
Multiplica por 0x8000 y le resta -0.5 decimal.. o casi 0x1.. es por eso que da aproximado a multiplicarlo por 0x7FFF . Pero como te digo, no te aseguro nada ya que C me puede... xD, que respondan lo que saben C..
**************** EDIT *******************
Sacado de Wikipedia
Conversion
Float to Q
To convert a number from floating point to Qm.n format:
Multiply the floating point number by 2n
Round to the nearest integer
Q to Float
To convert a number from Qm.n format to floating point:
Convert the number to floating point as if it were an integer
Multiply by 2−n
Pasar de Float a Q15.. multiplica el valor por 2^15 = 32768 = 0x8000 y luego redondea.. deberias tener activo el bit RND del registro CORCON para un redondeado convencional. SI alguno sabe mas y le estoy pifiando feo,, q me avize xD jeje