zoukankan      html  css  js  c++  java
  • 为何很大的浮点大数加一个很小的数计算结果不是预期

    通常浮点数被表示成N=S*rj S称为尾数,可正可负,j称为阶码可正可负。r是基数,在计算机中取以2的倍数。

    计算机中为了提高精度,进行规格化操作:即假设N=11.0101  则规格化表示为N=0.110101*210表示,因为该规格化使得浮点数的表示精度最高。

    机器中浮点数由两部分组成:阶码和尾数。基数为2

    阶码由阶符跟阶码组成,尾数由数符跟尾数组成

    其中阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位数。尾数是小数,其位数反映了浮点数的精度。

    还有机器零这个概念:即浮点数尾数为0,或者阶码小于等于所能表示的最小数。机器都把该浮点数看成0.并称该0为机器0.

    计算机中两个浮点数加减法的运算步骤:

    1、对阶,使两个数的小数点位置对齐。则需要使阶码一样。也就是咱们数学经常做的x*100+y*1000 = x*0.1*1000+y*1000  因为计算机中对阶是低阶向高阶对齐。则当两个数值相差很大的时候,在进行对阶的时候小数点需要向左移动,导致末端的数据会出现丢失的现象。一个很简单的例子,比如0.10100*2100跟0.10000*21000,则进行对阶的时候则小的这个数需要阶码需要加100,又因为精度为5位,则使得左边的数表示为0.00001*21000而导致出现精度丢失现象。

    2、尾数求和。则如第一个例子的0.10100*2100跟0.10000*21000对阶相加之后的结果为0.10001*21000

    3、规格化,即将小数点的最高位移到为1,因为当前最高位为1所以不用移动

    4、舍入,为提高精度,考虑尾数右移时丢失的数值。

    5、溢出判断。

    这里只讲为啥相加会有精度丢失的现象。相减也是同一个道理,对阶导致的精度丢失。

  • 相关阅读:
    极光推送 标签和别名设置说明
    极光推送集成遇到的坑
    iOS开发:创建推送开发证书和生产证书,以及往极光推送官网上传证书的步骤方法
    【大数据算法】蓄水池抽样算法
    【leetcode】Find Minimum in Rotated Sorted Array I&&II
    朴素贝叶斯算法的实例
    【leetcode】Min Stack -- python版
    朴素贝叶斯算法的python实现
    决策树的python实现
    kNN算法python实现和简单数字识别
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/5060117.html
Copyright © 2011-2022 走看看