自己写了一个单精度浮点数转换为IEEE754格式的java程序!!
源码:
package com.mangocity.helloworld.float2IEEE;
/**
* <h3>只支持单精度-32bits的计算</h3>
* <p/>
* 单精度浮点数转IEEE754
* 第1位是数符s s=1表示负数 s=0表示正数
* 第2-9位为阶码E (双精度为2-12位)
* 第10-32位为尾数M (双精度为13-64位)
* 转换规则:
* V = (-1)^s*(1+M)*2^(E-127)(单精度)
* V = (-1)^s*(1+M)*2^(E-1023)(双精度)
* <p/>
* Created by JimmyWang on 2014/8/10.
*/
public class Float2IEEE {
/**
* 求整数的二进制:取余法
*
* @param integral 整数
* @return 返回整数的二进制
*/
private static String calculate(int integral) {
int cal = 0; // 记录位数
StringBuilder builder = new StringBuilder(""); // 初始化容量为16
while (integral != 0) {
builder.append(integral % 2);
integral = integral / 2;
cal++;
}
for(int i = 0; i < (8 - cal); i++) {
builder.append("0");
}
return builder.reverse().toString();
}
/**
* 求小数的二进制
*
* @param decimal 小数
* @return 返回小数的二进制
*/
private static String calculate(float decimal) {
if (decimal > 1) {
decimal = decimal - 1;
}
int mantissa = 23; // 小数位数
StringBuilder builder = new StringBuilder("");
for (int i = 0; i < mantissa; i++) {
decimal *= 2;
if (decimal >= 1) {
builder.append("1");
decimal = decimal - 1;
} else {
builder.append("0");
}
}
return builder.toString();
}
/**
* 求浮点数的指数和尾数,数组0号位为指数,1号位为尾数
*
* @param fValue 浮点数
* @return 返回指数和余数,0号位为指数,1号位为尾数
*/
private static String[] getExponentAndDecimal(float fValue) {
String[] values = new String[2];
int i = 0;
while (fValue >= 2F) {
fValue = fValue / 2;
i++;
}
// fValue为1的时候,特殊处理
if(0 == i) {
fValue = 0F;
}
values[0] = String.valueOf(i);
values[1] = String.valueOf(fValue);
return values;
}
/**
* 1 10000001 01000000000000000000000
* -1*2^(129-127)*(2^0+2^-2)
* 根据上面的公式,思路:
* 将浮点数不断除以2,可以得到指数;
* 最后余数小于2,为小数位
*
* @param f 参与转换的浮点数
* @return 转换后的IEEE754格式
*/
public static String trans(float f) {
StringBuilder builder = new StringBuilder();
if(0F == f) {
String temp = String.valueOf(f);
if(temp.contains("-")) {
return "10000000000000000000000000000000";
} else {
// 正0
return "00000000000000000000000000000000";
}
} else if (f < 0F) {
builder.append("1");
f = -f;
} else {
builder.append("0");
}
String[] expDec = getExponentAndDecimal(f);
int exponent = Integer.valueOf(expDec[0]) + 127; // 指数
float decimal = Float.valueOf(expDec[1]); // 尾数
// 指数全为0,尾数的附加位为0,否则为1
if (127 != exponent) {
decimal = decimal - 1F;
}
// 求二进制
String iBinary = calculate(exponent);
String fBinary = calculate(decimal);
builder.append(iBinary).append(fBinary);
return builder.toString();
}
public static void main(String[] args) {
float orig = 5.21F;
String IEEE = trans(orig);
System.out.println("浮点数 " + orig + " 转为IEEE754的格式为: " + IEEE);
return;
}
}
运行结果:
浮点数 -0.0 转为IEEE754的格式为: 10000000000000000000000000000000
浮点数 0.0 转为IEEE754的格式为: 00000000000000000000000000000000
浮点数 -1.0 转为IEEE754的格式为: 10111111100000000000000000000000
浮点数 1.0 转为IEEE754的格式为: 00111111100000000000000000000000
浮点数 -2.0 转为IEEE754的格式为: 11000000000000000000000000000000
浮点数 2.0 转为IEEE754的格式为: 01000000000000000000000000000000
浮点数 -3.0 转为IEEE754的格式为: 11000000010000000000000000000000
浮点数 3.0 转为IEEE754的格式为: 01000000010000000000000000000000
浮点数 -4.0 转为IEEE754的格式为: 11000000100000000000000000000000
浮点数 4.0 转为IEEE754的格式为: 01000000100000000000000000000000
浮点数 -5.0 转为IEEE754的格式为: 11000000101000000000000000000000
浮点数 5.0 转为IEEE754的格式为: 01000000101000000000000000000000
浮点数 5.21 转为IEEE754的格式为: 01000000101001101011100001010010
浮点数-5.21 转为IEEE754的格式为: 11000000101001101011100001010010
浮点数 9.0 转为IEEE754的格式为: 01000001000100000000000000000000
我只验证了5.21的结果
http://www.h-schmidt.net/FloatConverter/IEEE754.html