Messages in this thread | ![/](/images/icornerl.gif) | | Date | Mon, 28 Nov 2011 10:11:30 +0000 | From | Nuno Santos <> | Subject | Re: Floating point usage inside kernel |
| |
Ok, understood!
Just one more question. To do this, do I need to change the data type from double to int?
Thanks,
Nuno
On 11/25/2011 06:10 PM, Paulo Marques wrote: > Nuno Santos wrote: >>> [...] >>> Unless you have overflow or need more than 16 bits of fractional >>> precision, you'll have no problem with this approach. >>> >>> I hope this helps, >> Sorry, i'm not sure if I have completely understand your suggestion. Are >> you telling me to apply this transform only to my input data, or to all >> the operations that are applied in the function used in kernel? > Imagine that your matrix coefficients are: > > 2.5, 1, 4.7 > 45.3, 0.765, 10 > 0, 0, 1 > > and your input is: > > 3420.56, 5410.76, 1 > > You start by converting the matrix coefficients: > > 2.5 * 65536.0 = 163840 > .... > > so the matrix becomes: > > 163840 65536 308019 > 2968781 50135 655360 > 0 0 65536 > > This can be done in userspace and the coefficients can be sent to the > kernel as fixed point numbers. > > You do the same (this time on the kernel) with your input, so it becomes: > > 224169820 354599567 65536 > > Now you can do: > > q[0] = fixed_mul(p[0], a[0][0]) + fixed_mul(p[1], a[1][0]) + > fixed_mul(p[2], a[2][0]); > .... > > where "fixed_mul" is a function that does the multiplication as I > explained earlier. > > To convert the result back to an integer, just shift down by 16. >
| ![\](/images/icornerr.gif) |