#include <stdio.h>
#include <stdint.h>

typedef int32_t Q16;

Q16 floatToQ16(float in)
{
	return in*(1<<16);	
}
float q16ToFlaot(Q16 in)
{
	return (float)in/(1<<16);
}
Q16 q16mul(Q16 a, Q16 b)
{
	return (int64_t)a*b>>16;
}
Q16 q16pol(Q16 a, Q16 b, Q16 c, Q16 x)
{
	return q16mul(a, q16mul(q16mul(x, x), x)) 
	      + q16mul(b,q16mul(x,x)) 
	      + q16mul(c, x); 
}
int main(void) {
	printf("2*20.123^3+3*20.123^2+4*20.123=%f\n",
	        q16ToFlaot(q16pol(floatToQ16(2.0f), 
	                          floatToQ16(3.0f), 
	                          floatToQ16(4.0f), 
	                          floatToQ16(20.123f))));
	// your code goes here
	return 0;
}
