在線轉化:http://www.binaryconvert.com
2
3 import java.text.DecimalFormat; 4
5
6 public class SinglePrecision { 7
8 //浮點到二進制
9 public String Float2Binary(double n) {//使用double輸入,不影響
10 int signBit;//符號位 11 // String s = Float.toString((float) n); 這個方法會自動用 科學記數法4.52E-4
12 String s = (new DecimalFormat("################.######")).format(n); 13
14 /**
15 * 處理符號位 16 * 本來是有正負0的,這個地方就默認是正0了 17 */
18 if (n == 0) { 19 signBit = 0; 20 } else if (n < 0) { 21 signBit = 1; 22 s = s.substring(1);//把負號去掉
23 } else { 24 signBit = 0; 25 } 26
27 /**
28 * 不用判斷是小數還是整數,Float.toString()會自動在整數后補0,0也一樣 29 * 將整數部分小數部分分開: 30 */
31 String intFloat[] = s.split("\\."); 32 int intPart = Integer.valueOf(intFloat[0]); 33 float floatPart = Float.valueOf("0." + intFloat[1]); 34 // System.out.println(s); 35 // System.out.println(intPart); 36 //處理整數部分
37 boolean isReady = false; 38 String str_intpart = ""; //以1開頭的二進制數 如10——>1010,而不是32位
39 for (int i = 31; i >= 0; i--) { //
40 if (((intPart >> i) & 1) == 1) { 41 isReady = true; 42 } 43 if (isReady) { 44 str_intpart += ((intPart >> i) & 1) == 1 ? 1 : 0; 45 } 46 } 47
48 //處理小數部分——乘2取整法
49 String str_floartPart = ""; 50 while (floatPart != 0) { 51 floatPart *= 2; 52 if (floatPart >= 1) { 53 floatPart -= 1; 54 str_floartPart += 1; 55 } else str_floartPart += 0; 56 } 57
58 /**
59 * 規格化 60 */
61 String str_int_float = str_intpart + str_floartPart+"0000000000000000000000000000000"; //補0是因為可能不夠長 62 //現在得到二進制下的:"整數(.)小數"格式。考慮規格化
63 int diff = 0;// 規格化所要將小數部分移動的位數,主要是針對整數部分為0的
64 int intlen = str_intpart.length(); 65 str_intpart = str_int_float.substring(0, 1); 66 str_floartPart = str_int_float.substring(1,23); 67 while (str_intpart.charAt(0) != '1') { 68 str_intpart = str_floartPart.substring(0, 1); 69 str_floartPart = str_floartPart.substring(1); 70 diff++; 71 } 72
73 int expChange = intlen != 0 ? intlen - 1 : -diff - 1; //規格化所帶來的指數的移動 74
75 //得到8位指數部分;
76 int exponential = expChange + 127;//真正的指數
77 String exp = ""; //指數
78 for (int i = 7; i >= 0; i--) { 79 exp += ((exponential >> i) & 1) == 1 ? 1 : 0; 80 } 81
82 //得到23位底數部分
83 String base = str_floartPart; 84 int len = base.length(); 85 for (int i = 0; i < 23 - len; i++) { 86 base += 0; 87 } 88
89 return signBit + " " + exp + " " + base; 90 } 91
//二進制到浮點小數
92 public double binary2Float (String binary){ 93 if (binary.length()!=32) { 94 System.out.println("Error!"); 95 return 0; 96 } 97 String exp = binary.substring(1,9); 98 String base = "1"+binary.substring(9); 99 /**
100 * 分類: 101 * 底數全是0 102 */
103 double Base = 0; 104 int Exp = Integer.valueOf(exp,2)-127; 105 for (int i =0;i<24;i++){ 106 Base+=(base.charAt(i)=='1'?Math.pow(2,-i):0); 107 } 108 return Base*Math.pow(2,Exp); 109 } 110
111 public static void main(String[] args) { 112 SinglePrecision sp = new SinglePrecision(); 113 System.out.println(sp.Float2Binary(256.9375)); 114 System.out.println(sp.binary2Float("01000011100000000111100000000000")); 115
116 /**
117 * output: 118 * 0 10000111 00000000111100000000000 119 * 256.9375 120 */
121
122 } 123 }
//目前精度還是不夠,誤差較大。