#include #include #include #include //ビット列をただそれを表す数に直す(符号ビットなし) unsigned int my_btoi(char *str){ unsigned int x=0 ; int i, j, k; for(i=0; i<=31; i++){ if(str[i]=='1'){ x+=pow(2, (31-i)); } } return x; } //整数をただのビット列に直す(符号ビットなし) void my_itob(unsigned int x, char* tmp){ int i; char str[33]; for(i=0; i<=31; i++){ if(x>=pow(2, (31-i))){ str[i]='1'; x-=pow(2, (31-i)); }else{ str[i]='0'; } } strcpy(tmp, str); } //ビット列を整数に直す(1の補数で) unsigned int btoi32(char* str){ int i , j, k ; unsigned int x=0 ; if(str[0]=='0'){ //正の数 for(i=1; i<32; i++){ if(str[i]=='1') x+=pow(2,(31-i)); } }else if(str[0]=='1'){ //負の数 for(i=1; i<32; i++){ if(str[i]=='0') x+=pow(2, (31-i)); } x+=1; x*=(-1); } return x; } //整数をビット列に直す(1の補数で) void itob(int a, char *str1){ char str[33]; int i, k, j; str[32]='\0'; if(a>=0){ //正の数 str[0]='0'; for(i=1; i<32; i++){ if(a>=pow(2, (31-i))){ a-=pow(2, (31-i)); str[i]='1'; }else{ str[i]='0'; } } }else if(a<0){ //負の数 str[0]='1'; a=(-1)*a -1; for(i=1; i<32; i++){ if(a>=pow(2,(31-i))){ a-=pow(2,(31-i)); str[i]='0'; }else{ str[i]='1'; } } } strcpy(str1, str); } //32ビット列を浮動小数点にする float btod (char* str){ int exp=0; float a=1.0; int i, k, j; int sign; j=0; if(str[0]== '0'){ // puts("sei"); sign=0; } if(str[0]== '1'){ // puts("fu"); sign=1; } for(i=1; i<=8; i++){ if(str[i]=='1'){ exp+=pow(2,8-i); }else if(str[i]=='0'){ j+=1; } } exp-=127; a =pow(2,exp); for(i=9; i<32; i++){ if(str[i]=='1'){ a += pow(2, ((-1)*i+8+exp)); } } if(j==8) return 0; if(sign==0) return a; if(sign==1) return (-1)*a; } //浮動小数点をビット列にして引数の文字列に渡す void dtob(float a, char *str ){ char tmp_str[33]; int exp=0; //指数部 ー127済み int i, j, k; float abs; //引数の絶対値 tmp_str[32] = '\0'; if(a>=0){ abs=a; tmp_str[0]= '0'; }else{ abs= a* (-1); tmp_str[0]= '1' ; } // printf("a: %.f\n", a); if(abs >=2){ while(abs >=2){ exp+=1; abs /=2; } exp+=127; }else if(abs == 0){ exp=0; //0のときは指数部も0 }else if(abs <1 ){ while(abs<1){ //仮数部の最初のビットが1となるように調整 exp -=1; abs *=2; } exp+=127; }else if(abs>=1 && abs<2){ exp = 127; } for(i=1; i<=8; i++){ if(exp>= pow(2,8-i)){ exp-=pow(2, 8-i); tmp_str[i]= '1'; }else{ tmp_str[i]= '0'; } } abs -=1; //隠れている最初のビット1を引く for(i=0; i<23; i++){ if(abs >= pow(2, (-i-1))){ tmp_str[i+9]= '1'; abs-= pow(2, (-i-1)); }else{ tmp_str[i+9]= '0'; } } strcpy(str, tmp_str); } unsigned int fpu_fadd(unsigned int in1, unsigned int in2){ char c1[33]; char c2[33]; char c3[33]; float a, b, c; unsigned int x; my_itob(in1, c1); my_itob(in2, c2); a=btod(c1); b=btod(c2); c=a+b; dtob(c, c3); x = my_btoi(c3); return x; } unsigned int fpu_fsub(unsigned int in1, unsigned int in2){ char c1[33]; char c2[33]; char c3[33]; float a, b, c; unsigned int x; my_itob(in1, c1); my_itob(in2, c2); a=btod(c1); b=btod(c2); c=a-b; dtob(c, c3); x = my_btoi(c3); return x; } unsigned int fpu_fmul(unsigned int in1, unsigned int in2){ char c1[33]; char c2[33]; char c3[33]; float a, b, c; unsigned int x; my_itob(in1, c1); my_itob(in2, c2); a=btod(c1); b=btod(c2); c=a*b; dtob(c, c3); x = my_btoi(c3); return x; } unsigned int fpu_inv(unsigned int in1){ char c1[33]; char c2[33]; float a, b; unsigned int x; my_itob(in1, c1); a=btod(c1); if(a==0){ printf("error: input 0 to fpu_inv\n"); return 0; } b=1/a; dtob(b, c2); x = my_btoi(c2); return x; } unsigned int fpu_finvsqrt(unsigned int in1){ char c1[33]; char c2[33]; float a, b; unsigned int x; my_itob(in1, c1); a=btod(c1); if(a<=0){ printf("nan\n"); return 0; } b= 1/sqrt(a); dtob(b, c2); x = my_btoi(c2); return x; } unsigned int fpu_ftoi(unsigned int in1){ unsigned int x; char c1[33]; char c2[33]; float a; my_itob(in1, c1); a=btod(c1); if(a>=0){ x=(int)(0.5+a); }else{ x=(int)(a-0.5); } return x; } unsigned int fpu_itof(unsigned int in1){ float a; unsigned int x; char c1[33]; a=(float)in1; dtob(a, c1); x=my_btoi(c1); return x; } unsigned int fpu_fless(unsigned int in1, unsigned int in2){ char c1[33]; char c2[33]; char sub1[32]; char sub2[32]; float a, b; unsigned int x; int f1,f2,f3,f4; //flag my_itob(in1, c1); my_itob(in2, c2); printf("c1---%s, c2---%s\n", c1, c2); strncpy(sub1,c1,9); strncpy(sub2,c2,9); sub1[9]='\0'; sub2[9]='\0'; printf("sub1-%s\n", sub1); printf("sub2-%s\n", sub2); f1=strcmp(sub1, "000000000"); f2=strcmp(sub1, "100000000"); f3=strcmp(sub2, "000000000"); f4=strcmp(sub2, "100000000"); printf("f1--%d, f2--%d, f3--%d, f4--%d\n", f1,f2,f3,f4); if((f1==0)&&(f3==0)){ return 0; } if((f2==0)&&(f3==0)){ return -1; } if((f1==0)&&(f4==0)){ return 0; } if((f2==0)&&(f4==0)){ return 0; } a=btod(c1); b=btod(c2); if(a