#include <stdio.h>
#include <stdint.h>
#include <math.h>
/* use FMA as correction*/
float foo1(float a, float k, float *res)
{
	float ret=(a-k)/(a+k);
	*res = fmaf(-ret,a+k,a-k)/(a+k);
	return ret;
}
/* do double precision quote, divide the double precision quote two two floats*/
float foo2(float a, float k, float *res)
{
	double rD=(double)(a-k)/(a+k);
	float ret =rD;
	*res = rD - ret;
	return ret;
}
/* naive method*/
float fooFloat(float a, float k)
{
	return (a-k)/(a+k);
}
/*reference*/
double fooDouble(float a, float k)
{
	return ((double)a-(double)k)/((double)a+(double)k);
}
int main(void) {
	// your code goes here
	float res1, res2;
	float a=1024*96/97.0f;
	float b =1024.0f;
	float ret1 = foo1(a, b, &res1);
	float ret2 = foo2(a, b, &res2);
	
	printf("diff_float = %.40f\n"
	       "diff_foo1  = %.40f\n"
	        "diff_foo2  = %0.40f\n\n",
	        fooDouble(a,b)-fooFloat(a, b),
	        fooDouble(a,b)-((double)(ret1)+(double)(res1)),
	        fooDouble(a,b)-((double)(ret2)+(double)(res2)));
	return 0;
}
