• 走进浮点数(摘自网络)


    若想了解float的组成及计算,我们需要先了解原码、补码、和反码的概念。

    一、原码、反码、补码(计算机中的符号数有三种表示方法)

      1.原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

        原码的缺点:原码是有符号数的最简单的编码方式,便于输入输出,但作为代码加减运算时较为复杂

      2.补码:在计算机系统中,数值一律用补码来表示和储存。原因在于,使用补码时,可以将符号和数值域统一处理。此外,补码与原码互相转换,其运算过程时相同的,不需要额外的有硬件电路。

       特性:

         (1)一个负整数(或原码)与其补数(或补码)相加,和为模(“模”实质上是计量器产生“溢出”的量)。

         (2)对一个整数的补码再求补码,等于该整数自身。

         (3)补码的正零与负零表示方法相同
      3.反码:正数的反码与其原码相同;负数的反码是对正数逐位取反,符号位保持为1
    二、浮点数标准
      1.IEEE-745标准从逻辑上采用一个三元组{S,E,M}来表示一个数N;
      它规定基数为2,符号位S用0和1分别表示正和负,尾数M用原码表示,阶码E用移码表示;
      尾数域的最高有效位总是1,尾数域所表示的值是1.M(实际存储的是M),这样可使尾数的表示范围比实际存储多一位;
      阶码E通常采用移码方式来表示,将数据的指数e 加上一个固定的偏移量后作为该数的阶码,这样做既可避免出现正负指数,又可保持数据的原有大小顺序,便于进行比较操作。
      2.一个浮点数(Value)的表示其实可以表示为
              Value = sign × exponent × fraction
      也就是说,一个浮点数的值等于符号位(sign bit)乘以指数偏移值(exponent bias)再乘以分数值(fraction) 
      3.指数偏移值:是指浮点数表示法中的指数域的编码值为指数的实际值加上某个固定的值

      4.为了强制定义一些特殊值,IEEE标准通过指数将表示空间划分成了三大块:

        【1】最小值指数(所有位全置0)用于定义0和弱规范数

        【2】最大指数(所有位全值1)用于定义±∞和NaN(Not a Number)

        【3】其他指数用于表示常规的数。

        通常情况,IEEE标准写法,尾数的1,省略,Fraction= 0.001001,因为标准写法,前面  的1总是省略 Fraction = 尾数 - 1 ;(IEEE规定小数点左侧的 1 是隐藏的

      ①  第一个域:为符号域。其中 0 表示数值为正数,而 1 则表示负数

      ②  第二个域为指数域,对应于我们之前介绍的二进制科学计数法中的指数部分。

      指数阈:通常使用移码表示:

    注意偏差值的概念:偏差值是为了表示复数引入的值,之前上课讲到的偏差值为128,此文中的偏差值为127

    实际的指数值 -127(保存为 全 0),即: 首先-127原码1-111 1111,的补码1-000 0001,然后加上单精度偏执: 0-111 111 ,即结果:0-000 0000,全0.  所以0-000 0000 指数位表示:-127,即e-127

      以及 +128(保存为全 1), 即:首先+128原码‘1’-000 0000,的补码, ‘1’-000 0000,然后加上单精度偏执:0-111 111 ,, 即结果:‘1’-111 1111,全1。   即全1 指数位表示:+128,即e+128

      这些特殊值,保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在 -127 和 127 之间。在本文中,最小指数和最大指数分别用 emin 和 emax 来表达。

    5. 根据IEEE(美国电气和电子工程师学会)754标准要求,无法精确保存的值必须向最接近的可保存的值进行舍入。不过对于二进制浮 点数而言,还多一条规矩,就是当需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为零者。

    6.据以上分析,IEEE 754标准中定义浮点数的表示范围为:

      单精度浮点数  二进制:± (2-2^-23) × 2127    对应十进制:  ~ ± 10^38.53

      双精度浮点数    二进制:± (2-2^-52) × 21023

    7.

      (1)  当P=0,M=0时,表示0。
      (2)  当P=255,M=0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。
      (3)  当P=255,M≠0时,表示NaN(Not a Number,不是一个数)。

  • 相关阅读:
    Unity 关于特效和UI显示的优先级问题
    使用Frida神器轻松实现hook C/C++方法
    理解 Android Binder 机制(三):Java层
    理解 Android Binder 机制(二):C++层
    理解 Android Binder 机制(一):驱动篇
    Android Hook Instrumentation
    Cocos Creator 中根据uuid快速定位资源
    android 通用混淆配置
    vToRay + bbr 加速
    SpringBoot项目单元测试
  • 原文地址:https://www.cnblogs.com/JQbiu/p/10414908.html
Copyright © 2020-2023  润新知