直接貼代碼吧,歡迎交流,轉載請注明出處,謝謝。
1、頭文件:
1 /* 2 * mmath.h 3 * 4 * Created on: Dec 6, 2016 5 * Author: cow 6 */ 7 8 #ifndef MMATH_H_ 9 #define MMATH_H_ 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <tgmath.h> 13 #include <string.h> 14 15 long FloatTohex(float HEX);//浮點數到十六進制轉換 16 17 float BinarytoInt(char *ch,int num);//二進制到整數 18 19 float BinarytoSmallNumber(char *ch,int num);//小數的二進制到小數 20 21 float HextoFloat(char* ch); //傳入8位16進制 42F0E666 22 23 24 #endif /* MMATH_H_ */
2、source
/*
* mymath.c
*
* Created on: Dec 6, 2016
* Author: cow
*/
#include "mymath.h"
long FloatTohex(float HEX)//浮點數到十六進制轉換1
{
return *( long *)&HEX;
}
float BinarytoInt(char *ch,int num)
{
int retint = 0,i = 0;
for(i = 0;i< num;i++)
{
retint = retint + (ch[i] == '1' ? 1:0) * pow(2,(num-1-i));
}
return (float)retint;
}
float BinarytoSmallNumber(char *ch,int num)
{
float retf = 0.0;
int i = 0;
for(i = 0;i<num;i++)
{
retf = retf + (ch[i] == '1'?1:0) * pow(2,(-(i + 1)) ) ;
}
return retf;
}
float HextoFloat(char* ch) //傳入8位16進制 42F0E666
{
float returnData = 0.0;
int count = 8,i = 0;
char binary[32] = {0};
char tmp = '0';
for(i = 0;i<count;i++)
{
tmp = ch[i];
switch(tmp)
{
case '0':
sprintf(binary+i*4,"%s","0000");
break;
case '\0':
sprintf(binary+i*4,"%s","0000");
break;
case '1':
sprintf(binary+i*4,"%s","0001");
break;
case '2':
sprintf(binary+i*4,"%s","0010");
break;
case '3':
sprintf(binary+i*4,"%s","0011");
break;
case '4':
sprintf(binary+i*4,"%s","0100");
break;
case '5':
sprintf(binary+i*4,"%s","0101");
break;
case '6':
sprintf(binary+i*4,"%s","0110");
break;
case '7':
sprintf(binary+i*4,"%s","0111");
break;
case '8':
sprintf(binary+i*4,"%s","1000");
break;
case '9':
sprintf(binary+i*4,"%s","1001");
break;
case 'A':
sprintf(binary+i*4,"%s","1010");
break;
case 'B':
sprintf(binary+i*4,"%s","1011");
break;
case 'C':
sprintf(binary+i*4,"%s","1100");
break;
case 'D':
sprintf(binary+i*4,"%s","1101");
break;
case 'E':
sprintf(binary+i*4,"%s","1110");
break;
case 'F':
sprintf(binary+i*4,"%s","1111");
break;
case 'a':
sprintf(binary+i*4,"%s","1010");
break;
case 'b':
sprintf(binary+i*4,"%s","1011");
break;
case 'c':
sprintf(binary+i*4,"%s","1100");
break;
case 'd':
sprintf(binary+i*4,"%s","1101");
break;
case 'e':
sprintf(binary+i*4,"%s","1110");
break;
case 'f':
sprintf(binary+i*4,"%s","1111");
break;
default :
printf("default \n");
break;
}
}
printf("bin = %s\n",binary);
/*
* 符號位(1) 指數位(8) 有效數字(23)
* */
char symbol = binary[0];
char index[9] = {0};
char effectiveNumber[23] = {0};
memcpy(index,binary+1,8);
memcpy(effectiveNumber,binary+9,23);
// printf("symbol = %c\n",symbol);
// printf("index = %s\n",index);
// printf("effectiveNumber = %s\n",effectiveNumber);
float indexnum = 0.0,smallNumVal = 0.0,decnum = 0.0;
indexnum = BinarytoInt(index,8); //指數位大小
int numofmove = indexnum - 127; //小數點移動值,可能為負數
if(numofmove > 0) //小數點左移組成二進制
{
printf("(numofmove) = %d\n",(numofmove));
char * dec = (char *)malloc(( (numofmove) + 2) * sizeof(char));
memset(dec,0,((numofmove) + 2));
sprintf(dec,"%c",'1');
memcpy(dec + 1,effectiveNumber,(numofmove));
printf("dec = %s\n",dec);
decnum = BinarytoInt(dec,(numofmove) + 1);
printf("decnum = %f\n",decnum);
/* //有效數位,去掉整數位才是小數位 */
char* smallNum = (char *)malloc(sizeof(char) * ((23 - (numofmove)) +1) );
memset(smallNum,0,((23 - (numofmove)) + 1));//最後一位\0
//memcpy(smallNum,effectiveNumber + numofmove,(23 - numofmove)); 遇到0停止拷貝
sprintf(smallNum,"%s",effectiveNumber + (numofmove));
printf("smallNum = %s\n",smallNum);
smallNumVal = BinarytoSmallNumber(smallNum,(23 - numofmove));
}
//整數位是1
else if ( 0 ==numofmove )
{
smallNumVal = BinarytoSmallNumber(effectiveNumber,(23 - numofmove));
decnum = 1;
}
//小數點右移組成二進制,此時要左移小數點,只有小數部分
else
{
//char* smallNum = (char *)malloc(sizeof(char) * ((23 + (numofmove)) +1) );
char* smallNum = (char*)malloc(sizeof(char) * ( 23 - numofmove +1 ));
memset(smallNum,0,((23 - (numofmove)) + 1));
sprintf( (smallNum - numofmove - 1),"%s","1");
//smallNUm[(fabs(numofmove) - 1)] = '1';
sprintf((smallNum - numofmove ),"%s",effectiveNumber);
printf("smallNum = %s\n",smallNum);
smallNumVal = BinarytoSmallNumber(smallNum,(23 - numofmove));
decnum = 0;
}
returnData = decnum + smallNumVal;
//free 這裡就不寫了,懶
if(symbol == '0') //符號位是0 表示正數
{
return returnData;
}
else
{
return -returnData;
}
}
3、主函數
/*
* main.c
*
* Created on: Dec 2, 2016
* Author: cow
*/
#include "mymath.h"
int main()
{
// float f = HextoFloat("42F0E666");
// float f1 = HextoFloat("40B43333");
// float f2 = HextoFloat("3EE66666");
// printf("f = %f\n",f);
// printf("f1 = %f\n",f1);
// printf("f2 = %f\n",f2);
//float flh = 120.45;
float flh = -120.45;
char hex[9] = {0};
sprintf(hex,"%x",FloatTohex(flh));
printf("hex = %s\n",hex);
float f = HextoFloat(hex);
printf("f120.45 = %f\n",f);
return 0;
}
4、執行結果
