• 为何很大的浮点大数加一个很小的数计算结果不是预期


    通常浮点数被表示成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、溢出判断。

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

  • 相关阅读:
    request.json 打印中文乱码解决
    看懂项目代码需要掌握的技能 (java语言)
    jmeter响应断言通过,结果树中却显示红色
    nginx的upstream后端名称居然变成了请求的host了?
    基于QRcode创建和识别二维码的研究
    thinkphp访问mysql中文字段问题
    apache https访问配置
    如何获得bibitem格式的参考文献
    CSharp: Image Matting
    word2vec回顾
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/5060117.html
Copyright © 2020-2023  润新知