float轉IEEE 754 32位浮點數
阿新 • • 發佈:2022-02-15
以參考連結的內容為主,加入少量處理
#include <iostream> #include <stdio.h> //整數轉r進位制 //integer:整數 radix:進位制 result:結果陣列 num:生成r進位制所佔位數 void D1toB(int integer, int radix, int result[], int& num) { int i, j, n; for (i = 0; integer > 0; i++)//除r取餘 { result[i] = integer % radix; integer = integer / radix; } num = i;//r進位制位數 for (j = 0; j < i / 2; j++)//顛倒順序 { n = result[j]; result[j] = result[i - 1 - j]; result[i - 1 - j] = n; } } //小數轉r進位制 //decimal:小數 radix:進位制 result:結果陣列 num:生成r進位制所佔位數 void D2toB(double decimal, int radix, int result[], int& num) { int i; for (i = 0; decimal > 0 && i < 50; i++)//乘r取整 { result[i] = decimal * radix; decimal = decimal * radix; decimal = decimal - int(decimal); } num = i; } int main() { int integer;//整數部分 double decimal;//小數部分 int s, p[8], m[50];//浮點數符號位,階碼數,尾數 while (true) { double number;//輸入的浮點數 printf("請輸入一個浮點數:"); scanf_s("%lf", &number); getchar(); //取走回車符 int i, j; for (i = 0; i < 8; i++)//清零 { p[i] = 0; } for (i = 0; i < 50; i++) { m[i] = 0; } //確定符號位 if (number > 0) { s = 0; } else { s = 1; number = -number; } //將浮點數分成整數和小數 integer = (int)number; decimal = number - integer; //分別將整數和小數轉化成二進位制 int m_n1, m_n2; D1toB(integer, 2, m, m_n1); D2toB(decimal, 2, m + m_n1, m_n2); //規格化,計算階數, 尾數 int pn = 0;//階數 if (integer > 0)//小數點左移 { pn = m_n1 - 1;//階數 for (i = 0; i < 23; i++)//去掉首位預設的1 { m[i] = m[i + 1]; } } else//小數點右移 { for (i = 0; m[i] == 0; i++) { } pn = -i - 1; for (j = 0; j < 23; j++)//去掉左邊無效的0和第一個的1 { m[j] = m[j + 1 + i]; } } //計算階碼 int p1[8], pn1; D1toB(pn + 127, 2, p1, pn1);//階數轉二進位制 if (pn1 < 8)//不足8位左邊補0 { for (j = 0; j < 8 - pn1; j++) { p[j] = 0; } for (int k = 0; k < pn1; k++)//得出完整p { p[j + k] = p1[k]; } } else { for (i = 0; i < 8; i++)//得出完整p { p[i] = p1[i]; } } //輸出s printf("%d", s); //輸出p for (i = 0; i < 8; i++) { printf("%d", p[i]); } printf(" "); //輸出s //輸出m for (i = 0; i < 23; i++) { printf("%d", m[i]); } printf("\n\n"); int array1[32]; memset(array1,0,32); array1[0] = s; memcpy(array1 + 1,p,8*sizeof(int)); memcpy(array1 + 9, m, 22*sizeof(int)); for (i = 0; i < 32; i++) { printf("%d", array1[i]); } printf("\n\n"); int res[8]; int k = 0; for (i = 0; i < 32; i+=4) { res[k]=array1[i]*8 + array1[i+1]*4 + array1[i+2]*2 + array1[i+3]; k++; } for (i = 0; i < k; i++) { printf("%x", res[i]); } printf("\n\n"); } return 0; }
輸出結果