/* Low level precision floating point lib Author: Henrik Schiøler */ //low precision floating pt type typedef struct myfloat { signed char mantissa; signed char exponent; } myfloat_type; //convert from double to low precision type void doub2mydouble(double arg, myfloat_type *res) { int exponent; double temp; exponent = ceil(log(abs(arg))/log(2)); //base 2 logarithm temp=arg*pow(2,7-exponent); res->mantissa = (signed char)temp; res->exponent = exponent-7; } //convert from low precision type to double double myfloat2double(myfloat_type *arg1) { double res = (double)(arg1->mantissa) * pow(2,arg1->exponent); return res; } //multiply to low precision types void mult_float(myfloat_type *arg1,myfloat_type *arg2,myfloat_type *result) { int temp; unsigned char sign; sign=0x80 & ((unsigned char)arg1-> mantissa ^ (unsigned char)arg2-> mantissa); //find sign of result char i=0; temp = (int)(arg1-> mantissa) * (int)(arg2-> mantissa); temp = temp & 0x7f00; //take away sign from product while(abs(temp)>128) { i++; temp=temp>>1; } result->mantissa = (unsigned char) temp; result->mantissa = result->mantissa | sign; //add recorded sign result->exponent = arg1->exponent + arg2->exponent + i; }