浮点数(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
- 浮点数(32位)转换为IEEE754的格式
- Qt中IEEE754格式转换为浮点数方法
- 十进制浮点数转换成IEEE754标准的32浮点数的二进制格式
- 十进制浮点数转换成IEEE754标准的32浮点数的二进制格式
- IEEE754浮点数转换
- IEEE754浮点数转换
- IEEE754浮点数的转换方法
- [Java]IEEE754浮点数的转换方法
- IEEE754浮点数的转换方法
- C# IEEE754浮点数的转换方法
- IEEE754浮点数的转换方法
- IEEE754 浮点数格式
- IEEE754浮点数格式详解
- IEEE754 浮点数格式 与 Javascript number 的特性
- IEEE754 浮点数格式 与 Javascript number 的特性
- 基于IEEE754标准的Modbus浮点数转换程序实现
- ieee754的浮点数问题
- 浮点数的存储(IEEE754)
- hdu 1875 畅通工程再续
- 基于Spring的MVC框架设计与实现
- queue容器适配器
- 【优先队列】HDU Rescue
- 黑马程序员——内部类
- 浮点数(32位)转换为IEEE754的格式
- 一致性hash算法 - consistent hashing
- 如何在CSDN博客中编辑公式?
- USACO Section 1.3 PROB Calf Flac(最长回文子串)
- noncopyable
- 【算法导论学习-009】仅使用Random(0,1)实现Random(a,b)
- Java编程思想
- UVA - 10574 Counting Rectangles
- swift代码生成navigationController