单精度浮点数操作

用数组存储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 }

原文地址:https://www.cnblogs.com/XT-xutao/p/10111224.html

时间: 2024-10-09 19:46:09

单精度浮点数操作的相关文章

单精度浮点数

单精度浮点数格式 是一种计算机数据格式,在计算机存储器中占用4个字节(32 bits),利用"浮点"(浮动小数点)的方法,可以表示一个范围很大的数值. 在 IEEE 754-2008 的定义中,32-bit base 2格式被正式称为binary32格式.这种格式在IEEE 754-1985被定义为single,即单精度. 需要注意的是,在更早的一些计算机系统中,也存在着其他4字节的浮点数格式. 定义 第1位表示正负,中间8位表示指数,后23位表示有效数位. 正负号0代表正,1代表负.

单精度浮点数按存储格式转为整数的程序

/////////////////// #include<cstdio> //----------------- union int_char { unsigned char ch[4]; float i; }; void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上. { printf("单精度浮点数值为:%f\n",x.i,x.i); printf("存储位置从左到右,从高位到低位依次为 0x

单精度浮点数和有效位数为什么是7位

IEEE754标准 详细描述了单精度浮点数的格式 详查维基百科IEEE_754-1985  描述了包括如何表示( 规约化 非规约化 0 无穷 NAN)这几类以及为什么要如此表示 尾数位数越多,精度越高:指数位越多,可表示范围越大.物理中常用有效数字来描述此概念.https://zh.wikipedia.org/wiki/%E6%9C%89%E6%95%88%E6%95%B0%E5%AD%97 单精度浮点数的有效位数为什么是7位,找到的答案如下: 浮点数的精度取决于尾数部分.尾数部分的位数越多,能

CUDA 中 单精度浮点操作和 双精度浮点操作

在CUDA 中如果不指明是 单精度, CUDA会调用双精度实现.    (血泪呀!!!) 如果要使用单精度,要指明, 即使用 形如__fmul_rn(x,y)的函数. 详见链接!! http://stackoverflow.com/questions/14406364/different-results-for-cuda-addition-on-host-and-on-gpu?rq=1

单精度浮点数(float)加法计算出错

场景: 一个float型的变量赋值1170601,加上19000000,结果出现错误. 原因: float占用4个字节(32位)存储空间,包括符号位1位,阶码位8位,尾数23位.浮点数精度与它的尾数有关. 尾数为二进制小数1.m,m为23位的小数.所以浮点数的精度为24位二进制有效位数.2的24次方为16777216. 19000000 > 16777216,做加法计算之后丢失精度出错. 解决方法: 将float用double替换,double占用8个字节(64位)存储空间,包括符号位1位,阶码

线程暂停的方法、基本数据类型包装类、十进制单精度浮点数(32位)存入内存中、TreeSet和TreeMap

使线程暂停执行的方法? 1.Thread类的sleep()方法使线程进入阻塞状态,睡眠指定的时间段. 2.Object类的wait()方法使线程放弃对象锁,进入等锁池,直到获得对象锁后才继续往下执行 3.Thread类的yield()方法平时比较少用,使线程进入就绪状态而不是阻塞状态,也就是说下一个执行的线程可能还是这个线程,当然也可能让给了其他的线程,那么这个线程就暂停了. 4.Java5后的使用Lock接口也可以实现类似于对象锁的功能,优点是比较灵活.可以知道线程获得锁了没有等,比较大的缺点

Random 大型整数操作类BigInteger 大型浮点数操作类BigDecimal

package test; import java.util.Random; public class RandomDemo { public static void main(String[] args) { Random random = new Random(); //输出5个0~100之间的随机数 for(int i=0; i<5; i++) { System.out.print(random.nextInt(100) + "\t");//2 28 14 20 12 }

定点数与浮点数

I.定点数 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的.通常将定点数据表示成纯小数或纯整数,为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前:而为了将数表示成纯整数,则把小数点固定在数值部分的最后面,如下图所示: 图中所标示的小数点在机器中是不表示出来的,而是事先约定在固定的位置.对于一台计算机,一旦确定了小数点的位置,就不再改变. 假设用n位来表示一个定点数 ,其中 用来表示数的符号位,通常放在最左位置,并用数值0和1分别表示正号和负号,其余位数表示它的量值.如果定

程序员必知之浮点数运算原理详解

导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握.许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题. 许多人使用float/double进行货币计算时经常会犯错.这篇文章是这一系列中的精华,所有的软件开发人员都应该读一下. 随着你经验的增长,你肯定 想去深入了解一些常见的东西的细节,浮点数运算就是其中之一. 1. 什么是浮点数? 在计算机系统的发展过程中,曾经提出过多种方法表达实数. [1]典型的比如相对于浮点数的定点数(Fixed Point Num