• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

搁了个浅

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

什么是浮点数

什么是浮点数?

答:浮点数可以理解成二进制下的科学计数法,单精度浮点数的二进制格式有3个部分:1bit的符号部分,0为正1为负,8bit的指数部分范围从-127到128,剩下的是23bit的尾数部分。浮点数还包含双精度浮点数,它的原理和单精度浮点数是一样的。

 

详细内容如下:

IEEE 754 规定单精度浮点数的二进制格式为:S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFF

  • S:符号部分,1位,0表示正数,1表示负数。
  • E:指数部分,8位(双精度为11位),这里规定 00000000 到11111111 分别表示 -127 到 128,所以  01111111 表示 0 ,1000000 标示1。 
  • F:尾数部分,23位(双精度为52位),尾数部分所表示的完整信息应为 1.FFFFFFFFFFFFFFFFFFFFFFFF,这里的小数点和第一位的1都被省略了,其中 1 <= 1.FFFFFFFFFFFFFFFFFFFFFFFF < 2,注意位数部分的位数是23位。

在10进制的科学计数法中,1.2 * 10^3 中的 1.2 部分通常被称为尾数或系数,3被称为指数。而浮点数可以理解成二进制下的科学计数法。


10进制数转二进制浮点数:

10进制数 -12.5转成单精度浮点数的过程如下:

  • 12.5 转成二进制数是 1100.1。
  • S:符号部分为 1。
  • E:指数部分为 3,根据规则,3转换成指数部分应为:10000010。
  • F:尾数部分,将 12.5 转成二进制得到 1100.1,小数点左移3位并右补零补全24位,得到 1.1001000 00000000 00000000,去掉第一位的1和小数点后为  1001000 00000000 00000000。
  • 最终,-12.5 的单精度浮点数的二进制表示为 1 10000010 10010000000000000000000。附上代码
    public static void main(String[] args) {
        float floatValue = -12.5f;
        int intBits = Float.floatToIntBits(floatValue); //floatToIntBits()函数就是直接把ieee754的存储方式的值,当成int值
        String binaryString = Integer.toBinaryString(intBits);
        System.out.println("intBits: " + intBits); //intBits: -1052246016
        System.out.println("binary: " + binaryString); //binary: 11000001010010000000000000000000 
    }

 

 


二进制浮点数转10进制数

如果一个单精度浮点数是 0 10000011 11010000000000000000000,对应的十进制是多少?

  • S:符号部分表示正数。
  • E:指数部分为 4。
  • F:尾数部分为 11010000000000000000000,补上省略的1和小数点,得到尾数为 1.1101。
  • 将尾数的小数点后移4位得到 11101.0,对应的十进制数是 29,所以答案是29. 附上代码
    public static void main(String[] args) {
        float floatValue = 29f;
        int intBits = Float.floatToIntBits(floatValue);
        String binaryString = Integer.toBinaryString(intBits);
        System.out.println("intBits: " + intBits); //intBits: 1105723392
        System.out.println("binary: " + binaryString); //binary: 1000001111010000000000000000000 这里打印的是31位,左边的0被省略掉了
    }

 

posted on 2023-08-02 22:27  搁了个浅  阅读(797)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3