Hongbo

Jul 17, 2020

浅谈浮点数

——浅谈浮点数

计算机中的整数,小数

  • 整数,通俗的讲就是在各进制下;数的组成全由(1,2,3…..)等整数组成;不存在小数(分数)部分或小数部分为0,在计算机中所有的整数由0,1组成,表示成二进制数并储存在存储设备中

  • 小数是一种特殊的实数,在数值计算中有至关重要的作用;小数也可以表示成二进制,如:0.125就等于0.001;小数点将小数分成整数与小数两部分,可是在计算机中,机器只认识0,1;那么我们怎么在计算机中存储小数点呢?


浮点数

  • 浮点数的引入解决了小数在机器中存储的问题,但其作用却不止于此;

    浮点数不是就代表小数!!!

  • 官方解释:浮点数,是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法

    • 引入角度1: 浮点数既然可以在计算机中近似表示某个实数,那么就可以解决小数的问题
    • 角度2: 在一些16,32位的机器中,可是利用浮点数表示法近似表示更大或更小的数(实数范围上),如:6.023*1023(摩尔常数)
  • 定点数与浮点数

    • 定点数的含义是,在计算机中,我们表示一个实数的整数部分与小数部分的精度是固定的;比如在16位的系统中,可能用8位表示整数部分,8位表示小数部分(也可以其他分法);但这个方法有明显的局限性;比如,以上定点数只能表示(0,28-1),(-28, 27-1)范围内的数。

    • 浮点数的定义相对于定点数,我们不固定小数点的位置,以实现更大的精度


浮点数在计算机中的表示

  • IEEE标准

    • 浮点数的一般二进制表示法:整数部分第n位就表示2n,n从第0位开始计;小数部分第m位表示2-m,m从1开始计:0.125就等于0.001;

    • 将实数转化为IEEE754标准规格化的浮点数

      1. 确定符号位(0,1)

      2. 将该数写成一般的二进制小数形式

      3. 用二进制科学计数法表示该数,将小数点放在从左往右数第一个1后边。

        n= m * 2e

      4. 尾数即为小数点后那串二进制数;阶码即上述得到的指数加上偏差值所得的和(32位中为127,64位中为1024)

  • IEEE754规格化浮点数

  • 32位浮点数(float 单精度)

  • 64位浮点数(double 双精度)

从图中可以看出,无论是32位系统,还是64位;他们的后23位或52位来表示转换成科学计数后的小数部分,他们可以无限接近一,但永远小于1;并且对于一些不能用2的幂表示的小数,无论用多少位来表示,也不可能取到完全相等的一个值,只能是在有限位数下得到一个最近它的数,所以计算机中,浮点数是用于近似的表示某个任意的实数。

  • long double(拓展双精度浮点,80bit)

浮点数详细讲解

  • 浮点数间进行运算可能会造成误差

    因为一个浮点数的真正值只是表达预期值的一个近似值(部分小数部分可以由2的幂组成的浮点数忽略),其精度取决于不同的系统位数,在进行运算的过程中,可能会产生细微的误差(近似值会改变),并随着运算次数不断积累。有时候,为避免这种误差我们可以将其转换为整数运算(特别是python中,python支持无限制,且准确的整数运算)

  • 两个浮点数进行比较时,可能会产生不可预期的错误

    鉴于浮点数之间进行运算可能会产生误差,自然如果我们在某些时候将两个浮点数来进行比较也是有风险的

    上述代码输出如下

OLDER > < NEWER