/*
   Copyright 2008 Jeffrey Lee
   This file is part of WOUM.
   WOUM is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
   WOUM is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   You should have received a copy of the GNU General Public License
   along with WOUM.  If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "fixmath.h"

float fa,fb,fc,fd,fe,ff,fg; /* Real values */
f1616 f16a,f16b,f16c,f16d,f16e,f16f,f16g;
f248 f24a,f24b,f24c,f24d,f24e,f24f,f24g;
f2012 f20a,f20b,f20c,f20d,f20e,f20f,f20g;
f4816 f48a,f48b,f48c,f48d,f48e,f48f,f48g;
int c,i,ia,ib,ic;

extern int calc_izgrad(int a,int b,long long *c,long long *d); /* =(a*d)/(b*c) */

int main(void)
{
	/* Do a little menu */
	c = 1;
	while(c != 0)
	{
		printf("0. Quit\n3. Mul\n4. Div\n6. Sqrt\n7. Square\n8. Vlen\n9. izgrad\n");
		scanf("%i",&c);
		if (c == 3)
		{
			printf("Mul:Input numbers\n");
			scanf("%f%f",&fa,&fb);
			fc = fa*fb;
			printf("Real value %f*%f=%f\n",fa,fb,fc);
			f16a = f1616_FromFloat(fa);
			f16b = f1616_FromFloat(fb);
			f16c = f1616_mul(f16a,f16b);
			fc = f1616_ToFloat(f16c);
			printf("f1616 value=%f\n",fc);
			f20a = f2012_FromFloat(fa);
			f20b = f2012_FromFloat(fb);
			f20c = f2012_mul(f20a,f20b);
			fc = f2012_ToFloat(f20c);
			printf("f2012 value=%f\n",fc);
			f24a = f248_FromFloat(fa);
			f24b = f248_FromFloat(fb);
			f24c = f248_mul(f24a,f24b);
			fc = f248_ToFloat(f24c);
			printf("f248 value=%f\n",fc);
			f48a = f4816_FromFloat(fa);
			f48b = f4816_FromFloat(fb);
			f48c = f4816_mul(f48a,f48b);
			fc = f4816_ToFloat(f48c);
			printf("f4816 value=%016llx*%016llx=%f\n",f48a,f48b,fc);
			printf("double=%016llx*%016llx\n",(double) fa,(double) fb);
		}
		else if (c == 4)
		{
			printf("Div:Input numbers\n");
			scanf("%f%f",&fa,&fb);
			if (fb != 0)
				fc = fa/fb;
			else
				fc = 0;
			printf("Real value %f/%f=%f\n",fa,fb,fc);
			f16a = f1616_FromFloat(fa);
			f16b = f1616_FromFloat(fb);
			f16c = f1616_div(f16a,f16b);
			fc = f1616_ToFloat(f16c);
			printf("f1616 value=%f\n",fc);
			f20a = f2012_FromFloat(fa);
			f20b = f2012_FromFloat(fb);
			f20c = f2012_div(f20a,f20b);
			fc = f2012_ToFloat(f20c);
			printf("f2012 value=%f\n",fc);
			f24a = f248_FromFloat(fa);
			f24b = f248_FromFloat(fb);
			f24c = f248_div(f24a,f24b);
			fc = f248_ToFloat(f24c);
			printf("f248 value=%f\n",fc);
			f48a = f4816_FromFloat(fa);
			f48b = f4816_FromFloat(fb);
			f48c = f4816_div(f48a,f48b);
			fc = f4816_ToFloat(f48c);
			printf("f4816 value=%f\n",fc);
		}
		else if (c == 6)
		{
			printf("Square root:Input number\n");
			scanf("%f",&fa);
			f16a = f1616_FromFloat(fa);
			f20a = f2012_FromFloat(fa);
			f24a = f248_FromFloat(fa);
			f48a = f4816_FromFloat(fa);
			printf("Real value=%f\n",sqrt(fa));
			f16a = f1616_sqrt(f16a);
			fa = f1616_ToFloat(f16a);
			printf("f1616 value=%f\n",fa);
			f20a = f2012_sqrt(f20a);
			fa = f2012_ToFloat(f20a);
			printf("f2012 value=%f\n",fa);
			f24a  = f248_sqrt(f24a);
			fa = f248_ToFloat(f24a);
			printf("f248 value=%f\n",fa);
			f48a = f4816_sqrt(f48a);
			fa = f4816_ToFloat(f48a);
			printf("f4816 value=%f\n",fa);
		}
		else if (c == 7)
		{
			printf("Square:Input number\n");
			scanf("%f",&fa);
			f16a = f1616_FromFloat(fa);
			f20a = f2012_FromFloat(fa);
			f24a = f248_FromFloat(fa);
			f48a = f4816_FromFloat(fa);
			printf("Real value=%f\n",fa*fa);
			f16a = f1616_sqr(f16a);
			fa = f1616_ToFloat(f16a);
			printf("f1616 value=%f\n",fa);
			f20a = f2012_sqr(f20a);
			fa = f2012_ToFloat(f20a);
			printf("f2012 value=%f\n",fa);
			f24a  = f248_sqr(f24a);
			fa = f248_ToFloat(f24a);
			printf("f248 value=%f\n",fa);
			f48a = f4816_sqr(f48a);
			fa = f4816_ToFloat(f48a);
			printf("f4816 value=%f\n",fa);
		}
		else if (c == 8)
		{
			printf("Vlen:Input numbers\n");
			scanf("%f",&fa);
			scanf("%f",&fb);
			scanf("%f",&fc);
			fd = float_vlen(fa,fb,fc);
			printf("Real value=%f\n",fd);
			f16a = f1616_FromFloat(fa);
			f16b = f1616_FromFloat(fb);
			f16c = f1616_FromFloat(fc);
			f16d = f1616_vlen(f16a,f16b,f16c);
			printf("f1616 value=%f\n",f1616_ToFloat(f16d));
		}
		else if (c == 9)
		{
			printf("izgrad:Input numbers\n");
		/*	scanf("%f",&fa);
			scanf("%f",&fb);*/
			fa = -7617392934912;
			fb = -52385500000000;
			f48a = f4816_FromFloat(fa);
			f48b = f4816_FromFloat(fb);
			ic = (((float) 0x40000000)/0x2000)*((float) f48a)/(-((float) f48b)*640);
			ic = 0x20000*fa/(-fb*640);
			printf("Real value=%08x\n",ic);
			ic = calc_izgrad(0x40000000/0x2000,640,&f48b,&f48a);
			printf("calc value=%08x\n",ic);
		}
	}
	return 0;
}
