zoukankan      html  css  js  c++  java
  • Java float和double精度范围大小

    转载自:https://blog.csdn.net/tianmd_Eric/article/details/79729827?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

     也可以参考:https://blog.csdn.net/m0_37556444/article/details/86472306?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3

    要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的:

    举个例子:78.375,是一个正小数。要在计算机中存储这个数,需要把它表示为浮点数的格式,先执行二进制转换:

    一 小数的二进制转换(浮点数)
    78.375的整数部分:

    小数部分:

    所以,78.375的二进制形式就是1001110.011

    然后,使用二进制科学记数法,有

    注意,转换后用二进制科学记数法表示的这个数,有底有指数有小数部分,这个就叫做浮点数

    二 浮点数在计算机中的存储
    在计算机中,保存这个数使用的是浮点表示法,分为三大部分:

    第一部分用来存储符号位(sign),用来区分正负数,这里是0,表示正数

    第二部分用来存储指数(exponent),这里的指数是十进制的6

    第三部分用来存储小数(fraction),这里的小数部分是001110011

    需要注意的是,指数也有正负之分,后面再讲。

    如下图所示(图片来自维基百科):

    比如float类型是32位,是单精度浮点表示法:

    符号位(sign)占用1位,用来表示正负数,

    指数位(exponent)占用8位,用来表示指数,

    小数位(fraction)占用23位,用来表示小数,不足位数补0。

    而double类型是64位,是双精度浮点表示法:

    符号位占用1位,指数位占用11位,小数位占用52位。

    到这里其实已经可以隐隐看出:

    指数位决定了大小范围,因为指数位能表示的数越大则能表示的数越大嘛!

    而小数位决定了计算精度,因为小数位能表示的数越大,则能计算的精度越大咯!

    可能还不够明白,举例子吧:

    float的小数位只有23位,即二进制的23位,能表示的最大的十进制数为2的23次方,即8388608,即十进制的7位,严格点,精度只能百分百保证十进制的6位运算。

    double的小数位有52位,对应十进制最大值为4 503 599 627 370 496,这个数有16位,所以计算精度只能百分百保证十进制的15位运算。

    作者:Boss呱呱
    链接:https://www.zhihu.com/question/46432979/answer/221485161
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    三 指数位的偏移量与无符号表示
    需要注意的是指数可能是负数,也有可能是正数,即指数是有符号整数,而有符号整数的计算是比无符号整数麻烦的。所以为了减少不必要的麻烦,在实际存储指数的时候,需要把指数转换成无符号整数。那么怎么转换呢?

    注意到float的指数部分是8位,则指数的取值范围是 -126到+127,为了消除负数带来的实际计算上的影响(比如比较大小,加减法等),可以在实际存储的时候,给指数做一个简单的映射,加上一个偏移量,比如float的指数偏移量为127,这样就不会有负数出现了。

    比如

    指数如果是6,则实际存储的是6+127=133,即把133转换为二进制之后再存储。

    指数如果是-3,则实际存储的是-3+127=124,即把124转换为二进制之后再存储。

    当我们需要计算实际代表的十进制数的时候,再把指数减去偏移量即可。

    对应的double类型,存储的时候指数偏移量是1023。

    四 最后
    所以用float类型来保存十进制小数78.375的话,需要先转换成浮点数,得到符号位和指数和小数部分。这个例子前面已经分析过,所以:

    符号位是0,

    指数位是6+127=133,二进制表示为10 000 101,

    小数部分是001110011,不足部分请自动补0。

    连起来用float表示,加粗部分是指数位,最左边是符号位0,代表正数:

    0 10000101 001110011 00000 00000 0000

    如果用double来保存。。。自己计算吧,太多0了。

    作者:Boss呱呱
    链接:https://www.zhihu.com/question/46432979/answer/221485161

  • 相关阅读:
    02-JavaScript语法
    001 docker基本环境的搭建
    023 虚拟机的安装
    022 虚拟机的网络配置
    021 虚拟机的安装
    004 java客户端的开发
    003 Rabbitmq中交换机的类型
    002 Rabbitmq的基础概念
    001 基础环境的搭建
    001 基本的环境的安装
  • 原文地址:https://www.cnblogs.com/faberbeta/p/12825556.html
Copyright © 2011-2022 走看看