设备二进位浮点算数标准

32位浮点数IEEE754格式: 1位符号位 + 8位指数位 + 23位尾数

转换思路:

1、计算整数部分的二进制格式;

2、计算小数部分的二进制格式;

3、位移并计算指数

4、合并



  1. package com.holon.sample;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashSet;  
  5. import java.util.List;  
  6. import java.util.Set;  
  7.   
  8. public class IEEE754 {  
  9.     public static void main(String[] args) {  
  10.         Float f = 100.2f;  
  11.         IEEE754 ieee = new IEEE754();  
  12.   
  13.         String ieee754 = ieee.floatToIEEE754(f);  
  14.         System.out.println(ieee754);  
  15.     }  
  16.   
  17.     /** 
  18.      * 获取float的IEEE754存储格式 
  19.      * @param value 
  20.      * @return 
  21.      */  
  22.     public String floatToIEEE754(float value) {  
  23.         //符号位  
  24.         String sflag = value > 0 ? "0" : "1";  
  25.           
  26.         //整数部分  
  27.         int fz = (int) Math.floor(value);  
  28.         //整数部分二进制  
  29.         String fzb = Integer.toBinaryString(fz);  
  30.         //小数部分,格式: 0.02  
  31.         String valueStr = String.valueOf(value);  
  32.         String fxStr = "0" + valueStr.substring(valueStr.indexOf("."));  
  33.         float fx = Float.parseFloat(fxStr);  
  34.         //小数部分二进制  
  35.         String fxb = toBin(fx);  
  36.           
  37.         //指数位  
  38.         String e = Integer.toBinaryString(127 + fzb.length() - 1);  
  39.         //尾数位  
  40.         String m = fzb.substring(1) + fxb;  
  41.   
  42.         String result = sflag + e + m;  
  43.   
  44.         while (result.length() < 32) {  
  45.             result += "0";  
  46.         }  
  47.         if (result.length() > 32) {  
  48.             result = result.substring(032);  
  49.         }  
  50.         return result;  
  51.     }  
  52.   
  53.     private String toBin(float f) {  
  54.         List<Integer> list = new ArrayList<Integer>();  
  55.         Set<Float> set = new HashSet<Float>();  
  56.         int MAX = 24// 最多8位  
  57.   
  58.         int bits = 0;  
  59.         while (true) {  
  60.             f = calc(f, set, list);  
  61.             bits++;  
  62.             if (f == -1 || bits >= MAX)  
  63.                 break;  
  64.         }  
  65.         String result = "";  
  66.         for (Integer i : list) {  
  67.             result += i;  
  68.         }  
  69.         return result;  
  70.     }  
  71.   
  72.     private float calc(float f, Set<Float> set, List<Integer> list) {  
  73.         if (f == 0 || set.contains(f))  
  74.             return -1;  
  75.         float t = f * 2;  
  76.         if (t >= 1) {  
  77.             list.add(1);  
  78.             return t - 1;  
  79.         } else {  
  80.             list.add(0);  
  81.             return t;  
  82.         }  
  83.     }  
  84. }  

输出结果

浮点数:100.2

IEEE754格式:01000010110010000110011001100110



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值