p89~p90浮点数部分

来源:互联网 发布:免费足球缩水软件 编辑:程序博客网 时间:2024/06/18 09:50
#include<stdio.h>#include<math.h>#include<limits.h>typedef unsigned float_bits;float_bits f2u(float f){float_bits fb;fb=*((float_bits *)(&f));return fb;}float u2f(float_bits fb){float f;f=*((float *)(&fb));return f;}int float_equal(float_bits fb,float f){return f2u(f)==fb;}int test(float_bits(*fun1)(float_bits),float(*fun2)(float)){unsigned i=0;float_bits fb;float f;do{fb=fun1(i);f=fun2(u2f(i));if (!float_equal(fb,f)){printf("%x\n",i);break;}i++;}while (i!=0);printf("test ok");}int isNan(float_bits fb){unsigned exp=(fb>>23)&0xFF;unsigned frac=fb&0x7FFFFF;return (exp==0xFF)&&(frac!=0);}float_bits float_absval(float_bits fb){if (isNan(fb))return fb;elsereturn fb&0x7FFFFFFF;}float floatabsval(float f){if (isNan(f2u(f)))return f;elsereturn fabs(f);}float_bits float_negate(float_bits fb){if (isNan(fb))return fb;elsereturn fb^0x80000000;}float floatnegate(float f){if (isNan(f2u(f)))return f;elsereturn -f;}float_bits float_half(float_bits fb){unsigned sign=fb&0x80000000;unsigned exp=(fb>>23)&0xFF;unsigned frac=fb&0x7FFFFF;if (exp==0xFF)return fb;elseif (exp==0)return sign+(frac>>1)+((frac&1)&&((frac>>1)&1))/*一定要非常注意运算顺序,记得括号*/;elseif (exp==1)return sign+(frac>>1)+0x400000+((frac&1)&((frac>>1)&1));elsereturn sign|((exp-1)<<23)|frac;}float floathalf(float f){if (isnan(f))return f;elsereturn (float)0.5*f;}float_bits float_twice(float_bits fb){unsigned sign=fb&0x80000000;unsigned exp=(fb>>23)&0xFF;unsigned frac=fb&0x7FFFFF;if (exp==0xFF)return fb;elseif (exp==0)return sign+(frac<<1);elseif (exp!=254)return sign+((exp+1)<<23)+frac;elsereturn sign +0x7F800000;}float floattwice(float f){if (isnan(f))return f;elsereturn (float)2.0*f;}float_bits float_i2f(int i){unsigned sign,exp,frac,fb,tmp;int h;if (i==0)return 0;else{fb=i>0?i:-i;/*可以验证一下,即使对于INT_MIN也是成立的*/sign=i>0?0:1;h=32;while (((1<<(h-1))&fb)==0)h--;exp=h+126;if (h<=24)frac=(fb<<(24-h))&0x7FFFFF;else{frac=(fb>>(h-24))&0x7FFFFF;tmp=fb&((1<<(h-24))-1);if ((tmp>(1<<(h-25)))||((tmp==(1<<(h-25)))&&((frac&1)==1)))frac++;}return (sign<<31)+(exp<<23)+frac;}}int float_f2i(float_bits fb){unsigned sign=fb>>31;int exp=(int)((fb>>23)&0xFF)-127;/*这里不能用unsigned*/unsigned frac=fb&0x7FFFFF;int ans;if (exp<0)return 0;else{frac=frac+0x00800000;if (exp<=22){frac>>=(23-exp);ans=(int)frac;return sign==0?ans:-ans;}elseif (exp<=30){frac<<=(exp-23);ans=(int)frac;return sign==0?ans:-ans;}elsereturn INT_MIN;}}

0 0
原创粉丝点击