Java中的浮点数分析

 更新时间:2006年12月23日 00:00:00   作者:  
文章来源:csdn 作者:treeroot

 浮点数分为单精度和双精度,Java中的单精度和双精度分别为float和double.你们知道float和double是怎么存储的吗?

   float占4个字节,double占8个字节,为了方便起见,这里就只讨论float类型.
   float其实和一个int型的大小是一样的,一共32位,第一位表示符号,2-9表示指数,后面23位表示小数部分.这里不多说,请参考:http://blog.csdn.net/treeroot/archive/2004/09/05/95071.aspx

  这里只举一个例子,希望能抛砖引玉,就是研究一下浮点数0.1的存储形式,先运行这个程序.


  public class Test{
   public static void main(String[] args) {
   int x = 0x3d800000;
   int i = 1 << 22;
   int j = 1 << 4;
   float f = 0.1f;
   int y = Float.floatToIntBits(f);
   float rest = f - ( (float) 1) / j;

  while (i > 0) {
   j <<= 1;
   float deta = ( (float) 1) / j;
   if (rest >= deta) {
   rest -= deta;
   x |= i;
   }
   i >>= 1;
   }
   pr(x);
   pr(y);
   }

  static void pr(int i) {
   System.out.println(Integer.toBinaryString(i));
   }

  }

 结果:
   111101110011001100110011001101
   111101110011001100110011001101

  程序说明:
   int x=0x3d80000;
   因为浮点表示形式为1.f*2n-127我们要表示0.1,可以知道n-127=-4,到n=123
   符号为正,可知前9是 001111011,暂时不考虑后面的23位小数,所以我们先假设x=0x3d800000;


  int i = 1 << 22;
   i初始为第右起第23位为1,就是x的第10位

  int j = 1 << 4;

   i初始为4,因为n-127为-4,这里是为了求它的倒数.

  float f = 0.1f;
   int y = Float.floatToIntBits(f);

   y就是它的32位表示

  float rest = f - ( (float) 1) / j;

   这个rest表示除了1.f中的1剩下的,也就是0.f

  while (i > 0) {
   j <<= 1;
   float deta = ( (float) 1) / j;
   if (rest >= deta) {
   rest -= deta;
   x |= i;
   }
   i >>= 1;
   }

   这个循环来计算23位小数部分,如果rest不小于deta,表示这个位可以置为1.

  其他的不多说了,输入结果是一样的,可以说0.1这个浮点数肯定是不精确的,但是0.5可以精确的表示,想想为什么吧

相关文章

  • java实现短信验证码5分钟有效时间

    java实现短信验证码5分钟有效时间

    这篇文章主要为大家详细介绍了java实现短信验证码5分钟有效时间,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Java实现设计模式之责任链模式

    Java实现设计模式之责任链模式

    责任链模式是一种行为设计模式,允许你将请求沿着处理链发送,然后处理者都可对其进行处理,完成后可以再将其传递给下一个处理者。下面将会举例说明什么是责任链模式,责任链模式该如何使用
    2022-08-08
  • Java集合教程之Collection实例详解

    Java集合教程之Collection实例详解

    集合,或者叫容器,是一个包含多个元素的对象,下面这篇文章主要给大家介绍了关于Java集合教程之Collection的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-08-08
  • java多线程编程之慎重使用volatile关键字

    java多线程编程之慎重使用volatile关键字

    volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,下面看一下为什么要慎重使用volatile关键字
    2014-01-01
  • MAC上IntelliJ IDEA的svn无法保存密码解决方案

    MAC上IntelliJ IDEA的svn无法保存密码解决方案

    今天小编就为大家分享一篇关于MAC上IntelliJ IDEA的svn无法保存密码解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 关于Selenium的UI自动化测试屏幕截图功能实例代码

    关于Selenium的UI自动化测试屏幕截图功能实例代码

    今天小编就为大家分享一篇关于Selenium的UI自动化测试屏幕截图功能实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Java中数据库加密的方式分享

    Java中数据库加密的方式分享

    在现今互联网时代,数据安全已经成为了我们必须要面对的重要课题,在本文中,我们将会介绍Java中常用的几种数据库加密方式并分析一下它们的优缺点,希望对大家有所帮助
    2023-05-05
  • win10安装rabbitMQ的详细步骤

    win10安装rabbitMQ的详细步骤

    RabbitMQ是一个开源的消息中间件(Message Broker),它基于AMQP协议设计,用于在分布式系统中实现消息的高效、可靠传输,本文给打击介绍了win10安装rabbitMQ的详细步骤,文中通过图文讲解的非常详细,需要的朋友可以参考下
    2024-06-06
  • Java 限制前端重复请求的实例代码

    Java 限制前端重复请求的实例代码

    这篇文章主要介绍了Java 限制前端重复请求,文中给大家提到了JAVA利用自定义本地锁解决重复提交的问题,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 在CentOS上安装Java 17并实现多版本共存的详细教程

    在CentOS上安装Java 17并实现多版本共存的详细教程

    在现代软件开发中,Java 作为一种广泛使用的编程语言,其版本更新频繁,不同项目可能依赖不同版本的 Java 运行环境,CentOS 作为一款流行的 Linux 发行版,常被用于服务器部署和开发环境,本文将详细介绍如何在 CentOS 上安装 Java 17,并实现与现有 Java 8 的多版本共存
    2025-03-03

最新评论