2,432
社区成员




float my_fdivide(float x1, float x2){
int xq1, xq2, xq;
int exponent1, exponent2, n, index;
int sign = (((*(int*)&x1)&0x80000000)) ^ (((*(int*)&x2)&0x80000000));
if(((*(int*)&x1)&0x7f800000)==0x00000000){
return 0.0f;
} else if(((*(int*)&x1)&0x7f800000)==0x7f800000){
return 0.0f;
} else {
xq1 = ((*(int*)&x1)&0x7fffff) | 0x800000;
exponent1 = 150 - ((*(int*)&x1)>>23 & 0xff);
}
if(((*(int*)&x2)&0x7f800000)==0x00000000){
//被除数为0,非法
return 0.0f;
} else if(((*(int*)&x2)&0x7f800000)==0x7f800000){
return 0.0f;
} else {
xq2 = ((*(int*)&x2)&0x7fffff) | 0x800000;
exponent2 = 150 - ((*(int*)&x2)>>23 & 0xff);
}
exponent1 = 23 - exponent1 - 23;
exponent2 = 23 - exponent2 - 23;
//本着扩大被除数,减小除数的原则移位
n = 0;
for(index=0; index<31; index++){
if(!(xq2 & (1<<index))){
n++;
} else {
break;
}
}
exponent2 = exponent2 + n;
xq2 = xq2>>n;
xq = (xq1<<7)/xq2; //被除数占满可使用位
n = -1;
for(index=0; index<31; index++){
if(xq & (1<<index)){
n = index;
}
}
if(n == -1)
return 0.0f;
else{
exponent1 = (exponent1 - exponent2) - 7 + n + 127;
if(n-23>=0){
xq = xq>>(n-23);
}else{
xq = xq<<(23-n);
}
xq = (xq&0x807fffff)|((exponent1&0xff)<<23);
xq = xq | sign;
return *(float*)&xq;
}
}