Q31 Library
mikroC PRO for PIC32 includes a library for operating and working with Q31 fractional number format.
Library Routines
- Q31_Abs
- Q31_Add
- Q31_Sub
- Q31_Itof
- Q31_Ftoi
- Q31_Itoa
- Q31_Atoi
- Q31_Sin
- Q31_Cos
- Q31_Tan
- Q31_Asin
- Q31_Acos
- Q31_Atan
- Q31_Log
Q31_Abs
Prototype |
unsigned int Q31_Abs (longint in, longint *out); |
---|---|
Description |
Function calculates absolute value of the Q31 fractional format number. |
Parameters |
|
Returns |
Function always returns zero. |
Q31_Add
Prototype |
unsigned int Q31_Add(longint in1, longint in2, longint *out); |
---|---|
Description |
Function sums two Q31 format numbers. If the result exceeds [-2147483648, 2147483647] limits, result will be maximal(minimal) number in Q31 format. |
Parameters |
|
Returns |
|
Q31_Sub
Prototype |
unsigned int Q31_Sub(longint in1, longint in2, longint *out); |
---|---|
Description |
Function subtracts two Q31 format numbers. If the result exceeds [-2147483648, 2147483647] limits, result will be maximal(minimal) number in Q31 format. |
Parameters |
|
Returns |
|
Q31_Itof
Prototype |
unsigned int Q31_Itof(longint x, float *f); |
---|---|
Description |
Function converts number from the Q31 fractional number format to floating point number format. |
Parameters |
|
Returns |
Function always returns zero. |
Q31_Ftoi
Prototype |
unsigned int Q31_Ftoi(float f, longint *x); |
---|---|
Description |
Function converts number from the floating point number format to Q31 fractional number format. Input number scope should be in the range of [-1.00000, 0.99996]. If the floating point number is not in this range, the resulting number will be 0x7FFFFFFF (0x80000000). |
Parameters |
|
Returns |
|
Q31_Itoa
Prototype |
void Q31_Itoa(longint x, char *s); |
---|---|
Description |
Function converts number from the Q31 fractional format to ASCII string. Output ASCII string is in the following format : sn.ddddddddddddddddddddddddddddddd
|
Parameters |
|
Returns |
Nothing. |
Q31_Atoi
Prototype |
unsigned int Q31_Atoi(char *s, longint* out); |
---|---|
Description |
Function converts the input ASCII string s into a number in Q31 fractional point format. Input ASCII string should be in the following format: sn.ddddddddddddddddddddddddddddddd
|
Parameters |
|
Returns |
|
Q31_Cos
Prototype |
longint Q31_Cos(longint x); |
---|---|
Description |
Function returns the cosine of |
Parameters |
|
Returns |
Function returns value in the Q31 format, ranging from 1160290361 to 2147483647. |
Q31_Sin
Prototype |
longint Q31_Sin(longint x); |
---|---|
Description |
Function returns the sine of |
Parameters |
|
Returns |
Function returns value in the Q31 format, ranging from -1807039907 to 1807039904. |
Q31_Tan
Prototype |
longint Q31_Tan(longint x); |
---|---|
Description |
Function returns the tangent of |
Parameters |
|
Returns |
Function returns value in the Q31 format, ranging from -2147483648 to 2147483647. |
Q31_Asin
Prototype |
longint Q31_Asin(longint x); |
---|---|
Description |
Function returns the arc sine of |
Parameters |
|
Returns |
Function returns value in the Q31 format, ranging from -2147483648 to 2147483647. |
Q31_Atan
Prototype |
longint Q31_Atan(longint x); |
---|---|
Description |
Function returns the arc tangent of |
Parameters |
|
Returns |
Function returns value in the Q31 format, ranging from -1673210000 do 1673209982. |
Q31_Acos
Prototype |
longint Q31_Acos(longint x); |
---|---|
Description |
Function returns the arc cosine of |
Parameters |
|
Returns |
Function returns value in the Q31 format, ranging from 189407136 do 2147458881. |
Q31_Log
Prototype |
longint Q31_Log(longint x); |
---|---|
Description |
Function returns the logarithm of |
Parameters |
|
Returns |
Function returns value in the Q31 format, ranging from -2144585218 to 0. |
Library Example
long Q31_1, Q31_2; int i; long l; unsigned r; float f; char stringQ31[35]; void main() { // Q31_Ftoi......................................................... f = 0.5; r = Q31_Ftoi(f, &Q31_1); // Q31_1 = 0x40000000; r = 0; f = 1.5; r = Q31_Ftoi(f, &Q31_1); // Q31_1 = 0x7FFFFFF; r = 1; f = -2.5; r = Q31_Ftoi(f, &Q31_1); // Q31_1 = 0x80000000; r = 1; // Q31_Itof......................................................... Q31_1 = 0x08000000; r = Q31_Itof(Q31_1, &f); // f = 0.0625; r = 0; // Q31_Itoa......................................................... Q31_1 = 0x00000001; Q31_Itoa(Q31_1, stringQ31); // stringQ31 = " 0.0000000004656612873077392578125" // Q31_Atoi......................................................... r = Q31_Atoi("0.00001525878906", &Q31_1); // Q31_1 = 0x00007FFF; r = 0; r = Q31_Atoi("+1.25", &Q31_1); // r = 1; // Q31_Abs........................................................... Q31_Abs(0x12345678, &Q31_1); // Q31_1 = 0x12345678; Q31_Abs(0xFEDCBA98, &Q31_1); // Q31_1 = 0x01234568; // Q31_Add........................................................... r = Q31_Add(0xE0000000, 0xC0000000, &Q31_1); // Q31_1 = 0xA0000000; r = 0; r = Q31_Add(0xA0000000, 0xC0000000, &Q31_1); // Q31_1 = 0x80000000; r = 1; // Q31_Sub........................................................... r = Q31_Sub(0xE0000000, 0xC0000000, &Q31_1); // Q31_1 = 0x20000000; r = 0; r = Q31_Sub(0xA0000000, 0x40000000, &Q31_1); // Q31_1 = 0x80000000; r = 1; // Q31_Cos........................................................... Q31_Ftoi(0, &Q31_1); Q31_2 = Q31_Cos (Q31_1); Q31_Itof(Q31_2, &f); // f = cos(0) = 1 Q31_Ftoi(-1, &Q31_1); Q31_2 = Q31_Cos (Q31_1); Q31_Itof(Q31_2, &f); // f = cos(-1) = 0.5403023 // Q31_Sin........................................................... Q31_Ftoi(0, &Q31_1); Q31_2 = Q31_Sin (Q31_1); Q31_Itof(Q31_2, &f); // f = sin(0) = 0 Q31_Ftoi(-1, &Q31_1); Q31_2 = Q31_Sin (Q31_1); Q31_Itof(Q31_2, &f); // f = sin(-1) = -0.84161138 // Q31_Tan........................................................... Q31_Ftoi(0, &Q31_1); Q31_2 = Q31_Tan (Q31_1); Q31_Itof(Q31_2, &f); // f = tan(0) = 0 Q31_Ftoi(-0.78530, &Q31_1); Q31_2 = Q31_Tan (Q31_1); Q31_Itof(Q31_2, &f); // f = tan(-0.78546) = -0.999 // Q31_Asin......................................................... Q31_Ftoi(0, &Q31_1); Q31_2 = Q31_Asin (Q31_1); Q31_Itof(Q31_2, &f); // f = asin(0) = 0 Q31_Ftoi(-0.841308, &Q31_1); Q31_2 = Q31_Asin (Q31_1); Q31_Itof(Q31_2, &f); // f = asin(-0.8416137) = -0.99967 // Q31_Acos......................................................... Q31_Ftoi(0.6, &Q31_1); Q31_2 = Q31_Acos (Q31_1); Q31_Itof(Q31_2, &f); // f = acos(0.6) = 0.927295 Q31_Ftoi(0.5403137, &Q31_1); Q31_2 = Q31_Acos (Q31_1); Q31_Itof(Q31_2, &f); // f = acos(0.5403137) = 0.9999 // Q31_Atan......................................................... Q31_Ftoi(0, &Q31_1); Q31_2 = Q31_Atan (Q31_1); Q31_Itof(Q31_2, &f); // f = atan(0) = 0 Q31_Ftoi(-1, &Q31_1); Q31_2 = Q31_Atan (Q31_1); Q31_Itof(Q31_2, &f); // f = atan(-1) = -0.779149 // Q31_Log......................................................... Q31_Ftoi(0.3, &Q31_1); Q31_2 = Q31_Log (Q31_1); Q31_Itof(Q31_2, &f); // f = log(0.3) = -0.5228787 Q31_Ftoi(0.1, &Q31_1); Q31_2 = Q31_Log (Q31_1); Q31_Itof(Q31_2, &f); // f = log(0.1) = -0.9986508 }
What do you think about this topic ? Send us feedback!