单精度浮点数操作

Posted xt-xutao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单精度浮点数操作相关的知识,希望对你有一定的参考价值。

用数组存储32位单精度浮点数,并且实现有效位右移,有效数加法等,可用于计算机浮点加减法的底层模拟。

  1 package com.computerOrganizationAndArchitecture.floatQperation;
  2 
  3 import com.computerOrganizationAndArchitecture.singleprecisionfloat.SinglePrecision;
  4 
  5 /**
  6  * Created by XuTao on 2018/12/8 20:24
  7  * 这里用数组来存储32位的浮点数,
  8  */
  9 public class BinaryArray {
 10     protected int [] binArr;
 11     private int len;
 12     public BinaryArray(){
 13         len = 32;
 14         binArr = new int[32];
 15     }
 16     public BinaryArray(String s){
 17         len =32;
 18         binArr = new int[32];
 19         for (int i =0 ;i<32;i++){
 20             binArr[i] = s.charAt(i)==‘1‘?1:0;
 21         }
 22     }
 23     public BinaryArray(String s,int len){ //自定义长度
 24         this.len =len;
 25         binArr = new int[len];
 26         for (int i =0 ;i<len;i++){
 27             binArr[i] = s.charAt(i)==‘1‘?1:0;
 28         }
 29     }
 30     public BinaryArray(double n){
 31         len =32;
 32         binArr = new int[32];
 33         String ss=  new SinglePrecision().Float2Binary(n);//https://www.cnblogs.com/XT-xutao/p/9906351.html
 34         String s= ss.charAt(0)+ss.substring(2,10)+ss.substring(11);
 35         for (int i =0 ;i<32;i++){
 36             binArr[i] = s.charAt(i)==‘1‘?1:0;
 37         }
 38     }
 39 
 40     public void shiftRight(int n){//右移n位
 41         int [] temp = new int[n];
 42         for (int i=23;i>=n;i--){//移动
 43             binArr[i]=binArr[i-n];
 44         }
 45         for (int i=0;i<n;i++){//补0
 46            binArr[i]=0;
 47         }
 48     }
 49     public String toString(){
 50         String s= "";
 51         for (int i =0;i<len;i++){
 52             s+=binArr[i];
 53         }
 54         return s;
 55     }
 56     public String toString(int []binArr){
 57         String s= "";
 58         for (int i =0;i<binArr.length;i++){
 59             s+=binArr[i];
 60         }
 61         return s;
 62     }
 63     public String toExpString(){
 64         String s= "";
 65         for (int i =1;i<9;i++){
 66             s+=binArr[i];
 67         }
 68         return s;
 69     }
 70     public String toSignificandString(){ // 24位的
 71         String s= "";
 72         for (int i =9;i<len;i++){
 73             s+=binArr[i];
 74         }
 75         return "1"+s;
 76     }
 77     public int getExp (){
 78         return Integer.valueOf(toExpString(),2);
 79     }
 80 
 81     public static int[] add(String a,String b){//N位二进制+1位进位(0/1)相加  =N+1位
 82         //a,b长度要相等
 83         int [] temp = new int[a.length()+1];
 84         int [] arr1 = (new BinaryArray(a,a.length())).binArr;
 85         int [] arr2 = (new BinaryArray(b,b.length())).binArr;
 86         int carry = 0;
 87         for (int i =a.length()-1;i>=0;i--){
 88             temp[i+1] = arr1[i]+arr2[i]+carry;
 89             carry=0;
 90             if (temp[i+1]==2){
 91                 temp[i+1]=0;
 92                 carry = 1;
 93             }
 94             if (temp[i+1]==3){
 95                 temp[i+1]=1;
 96                 carry = 1;
 97             }
 98         }
 99         //最高位进位
100         temp[0] = carry==1?1:0;
101         return temp;
102     }
103 
104     public int[] getNegative(){
105         int [] temp = new int[32];
106         for (int i=0;i<32;i++){
107 
108         }
109         return temp;
110     }
111 
112     public static void main(String[] args) {
113         BinaryArray ba = new BinaryArray(-879.5);
114         System.out.println(ba.toString());
115         //11000100 01011011 11100000 00000000
116         System.out.println(ba.toSignificandString());
117 
118     }
119 
120 }

 

以上是关于单精度浮点数操作的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的浮点数取精度方法

unity 优化整理

unity 优化整理

Boost 的多精度模拟低精度快速浮点数

ieee754单精度浮点数 表示方法

js 双精度浮点数