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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值