浮点数(32位)转换为IEEE754的格式

来源:互联网 发布:中国网络什么时候墙的 编辑:程序博客网 时间:2024/04/30 19:13

自己写了一个单精度浮点数转换为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

0 0