zoukankan      html  css  js  c++  java
  • 浮点数的存储格式

    浮点数的小数点是不固定的,如果每个人都按照自己的爱好存储在电脑里,那不就乱套了吗?那么怎么在计算机中存储这种类型的数字呢?象这类古老的问题前人早都为我们做好了相应的规范,无规矩不成方圆吗。我们平时所说的浮点数的存储规范,就是由IEEE指定的,具体的规范文件是:IEEE Standard 754 for Binary Floating-Point Arithmetic。大家可以很容易的从网络上下载到这篇文档。

    下面,偶就大致的描述一下,感兴趣的“同志”们可以阅读原文。

    --------------------------------------------------------

    声明:
    此文为原创,欢迎转载,转载请保留如下信息
    作者:afreez 北京-中关村
    联系方式: (欢迎与作者交流)
    初次发布时间:

    初次发布在: http://blog.csdn.net/ganxingming/

    不经本人同意,不得用语商业或赢利性质目的,否则,作者有权追究相关责任!
    ---------------------------------------------------------

           在c语言中,单精度(float)数据类型为32bits,具体的如下图所示:

    整个32bits分三部分,即

           Sign:符号位,1 bit,0为正,1为负;

           Exponent(bias):指数部分,8 bits,存储格式为移码存储(后面还会说明),偏移量为127;

           Mantissa(fraction):尾数部分。

           对应的双精度(double)类型的格式为:

    同样,64位也被分为了三部分,对照单精度,不用我说就可以理解各个部分的含义了吧?

           是不是有点迷糊了,不要怕,理论这个东西最能忽悠人了,看起来很高深,其实也就是个屁大的事,举个例子就很容易明白了。

    举例说明,如3.24x103,则对应的部分为,Sign为0,3为指数部分(注意计算机里面存储的不是3,这里仅仅为了说明),3.24为尾数。我们知道,计算机“笨”的要死,只认识0和1,那么到底一个浮点数值在计算机存储介质中是如何存储的呢?

    例如,我们要想偷窥浮点类型的值4.25在计算机硬盘中存储的庐山真面目,请跟我来:首先把4.25转换成二进制的表达方式,即100.01,在详细点,变成1.0001x22,好了,对号入座把。

    Sign=0;

    Exponent(bias)=2+127=129 (偏移量为127,就是直接加上个127了);

    Mantissa=1.0001-1.0=0001(规格化后,小数点前总是整数1,全世界人都知道前面是1不是0,所以省略不写了,即尾数部分不包括整数部分;当别人问你,为什么23 bit的尾数部分可以表示24位的精度,知道怎么回答了吧。 靠,什么,没有看懂,再仔细读两便就知道了)。

    对照上面的图示,相信你已经看明白了吧?相信你的智商。为了加深认识,再来一个。如果给定你一个二进制数字串,01000000100010000000000000000000并告诉你这是一个float类型的值,让你说出它是老几,知道怎么算了吧?如果不知道,看下面的图,我就不废话解释了。

    2.2深入理解浮点存储格式

    为了更深入的理解浮点数的格式。我们使用C语言来做一件事。在C语言的世界里,强制类型转换,大家应该都很熟悉了。例如:

    float f=4.6;

    int i;

    i = (int)(f+0.5); // i=5

    ..

    下面我们不使用强制类型转化,我们自己来计算f转换成整形应该等于几?

    把主要代码帖出来,如下:

    //取23+1位的尾数部分

    int ival= ((*(int *)(&fval)) & 0x07fffff) | 0x800000;

    // 提取指数部分

    int exponent = 150 - (((*(int *)(&fval)) >> 23) & 0xff);

    if (exponent < 0)

    ival = (ival<< -exponent);

    else

    ival = (ival >> exponent);

    // 如果小于0,则将结果取反

    if ((*(int *)&fval) & 0x80000000)

    ival = -ival;

    好好琢磨琢磨吧,看明白了,就说明你基本明白了浮点数的存储格式,如果没有看明白,接着看,知道明白为止。

    (未完,待续......)

    http://blog.csdn.net/ganxingming/archive/2006/12/19/1449526.aspx

  • 相关阅读:
    (二分查找 拓展) leetcode 69. Sqrt(x)
    (二分查找 拓展) leetcode 162. Find Peak Element && lintcode 75. Find Peak Element
    (链表) lintcode 219. Insert Node in Sorted Linked List
    (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
    (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
    (字符串 数组 递归 双指针) leetcode 344. Reverse String
    (二叉树 DFS 递归) leetcode 112. Path Sum
    (二叉树 DFS 递归) leetcode 101. Symmetric Tree
    (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal
    (二叉树 递归 DFS) leetcode 100. Same Tree
  • 原文地址:https://www.cnblogs.com/cnlmjer/p/4099876.html
Copyright © 2011-2022 走看看