非规则浮点数和规则浮点数

本文由量化、数据类型、上溢和下溢衍生,将浮点数看作是实数域的一种量化方式,分析浮点数,尤其是非规则浮点数和规则浮点数之间的差异。

0. 背景、动机和目的

为了更好理解本文内容,可先行阅读《量化、数据类型、上溢和下溢》中内容。这里依旧将浮点数看作是一种量化方式,将连续的不可数的集合映射到有限的集合上去。本文结合单精度浮点数讨论,双精度浮点与之类似。

已有多位博主撰写过关于非规则浮点数(Denormalized Number)和规则浮点数之间的区别,这里首推卢钧轶的你应该知道的浮点数基础知识。这篇文章从Denormal numbernormal number之间的计算效率区别出发,概述了浮点数的相关知识,进而给出了Denormalized Number的定义,文中附有相应代码。浮点数的大部分知识可以从维基百科获取,包括

词条内容中的链接可以获取更多相关知识。

我在写量化、数据类型、上溢和下溢时有两个目的,一是从数字信号处理中量化的角度出发,阐明计算机内部数据的表示方式(即如何用有限的集合表示任意数,以及会带来什么样的问题),据此给出包括数据类型转化和计算过程中误差的产生原因;其二在于提醒自己无论是int或是double数据类型的数,表示能力都是有限的,在使用过程中需要注意上溢和下溢(尤其是下溢)的出现,以免出现错误。

在写的过程中,当我将浮点数当作非均匀量化时,却发现这个过程并不那么顺利,或许我应该单独的说明关于浮点数的相关内容,因此本文作为量化、数据类型、上溢和下溢的补充,旨在阐明

  • 浮点数到底是如何对实数域进行非均匀量化的
  • 为何要这样进行非均匀量化

1. 浮点数的非均匀量化

先给出一个示意图,这里将(0,4)区间非为了若干段,每段之间的数分配一个一样的值,这就是量化。而每段的长度是不同的,这种量化方式是非均匀的。

(By Blacklemon67 - created with tikz, CC BY-SA 3.0, https://en.wikipedia.org/w/index.php?curid=46487370)

为什么要进行非均匀量化?从数字信号处理的角度来说是为了保持相对一致的信噪比,当然可以简单的举个例子

测量1吨左右的物体,一般而言1吨零1克和零2克基本没有什么区别;然而测量重量约为1克的物体,是1克还是2克差别就很大了。

浮点数的具体定义在量化、数据类型、上溢和下溢中已经给出。

浮点型(32比特浮点)

参考维基百科, 32比特浮点数的存储方式表示如下图。

对应浮点数取值可表示为(十进制)

其中对于规则浮点数而言,指数项范围为01-FE(1到254)。大于0的浮点数依次为,然而大于1的浮点数依次为,即量化间隔是不同的。指数项取FF时,可表示正负无穷或是非数(譬如0/0)。我们更关注的是,指数项取0时浮点数的特性。

2. 为何要引入非规则浮点数

先看看规则浮点数的特点,指数项定义了区间大小,下一段区间长度是当前段的2倍,而fraction将区间等间隔的划分为了段,如下图所示

显然,如果仅仅用规则浮点数的表示方式,0到最小正常数之间的间隔要远远大于最小正常数到次小正常数之间的间隔,这是不满足我们的期望的。因此选择规则浮点数指数项范围从1开始。剩下的一小段区间(即黄色括号)再均匀划分为段,此时指数项取0,表示方式为

通过这一手段,满足了当数据(绝对值)越小时,其量化间隔越小(或相等)的要求。这样可以一定程度上提高计算精度。譬如,若不引入非规则浮点数,任何小于的数将会下溢为0,而引入不规则浮点数后,小于的数才会下溢为0 。

3. 非规则浮点数的问题

非规则浮点数的表示能力依旧是有限的,同时由于其与规则浮点数不相同的定义方式,会导致计算速率方面的问题,即

  • 非规则浮点数的计算速度慢于规则浮点数(一般而言)
  • 非规则浮点数无法解决计算过程中下溢的产生

计算速率的问题在卢钧轶的你应该知道的浮点数基础知识中已有详细的讨论,这里不再重复,仅简单的说明原因,以加法为例,浮点数加/减的步骤为

  1. 对阶。指数项对齐,小的向大的对齐
  2. 尾数求和。对齐后,对尾数进行加/减法
  3. 规则化。对尾数进行截取,保证计算精度
  4. 舍入。判断丢失的数值,进行舍入
  5. 判断结果。判断结果是否溢出

非规则浮点计算加法时“对阶”计算有不同 。normal numberDenormal number的统一表示方式为

若A,B为Denormal number,对位过程中

也就是说对阶过程可能有三种结果,即,这增加了计算的复杂程度。但具体的计算过程我也不清楚,就写到这里了。

对于第二个问题,尽管非规则浮点数极大的提高了在0附近的精度,然而浮点数的精度依旧是有限的,无法阻止下溢的发生。因此在计算过程中,尤其是对精度要求较高以及算法是迭代的情况下,一定要注意下溢这一问题。对于溢出的讨论,可参见量化、数据类型、上溢和下溢

时间: 2024-11-05 21:02:39

非规则浮点数和规则浮点数的相关文章

权威发布:长链非编码RNA命名规则

转自:http://blog.sina.com.cn/s/blog_8088f3700101pab7.html 权威发布:长链非编码RNA命名规则 对于人类基因命名标准的制定而言,雨果基因命名委员会(HGNC)是唯一官方授权的机构.HGNC的数据库中有38000个基因名称,其中大部分是编码蛋 白基因:但HGNC也命名了8500多个人类非编码基因及假非编码基因,通过与各层次专家们的合作,他们命名了大多数的小非编码RNA. 小非编码RNA一般可根据它们的同源性及相同功能来分类.相比而言,长链非编码R

非零缠绕规则和奇偶规则

在图形学中判断一个点是否在多边形内,若多边形不是自相交的,那么可以简单的判断这个点在多边形内部还是外部:若多边形是自相交的,那么就需要根据非零环绕数规则和奇-偶规则判断. 判断多边形是否是自相交的:多边形在平面内除顶点外还有其他公共点 内-外测试    不自交的多边形:多边形仅在顶点处连接,而在平面内没有其他公共点,此时可以直接划分内-外部分.    自相交的多边形:多边形在平面内除顶点外还有其他公共点,此时划分内-外部分需要采用以下的方法. (1)奇-偶规则(Odd-even Rule):奇数

Git忽略规则及.gitignore规则不生效的解决办法

Git忽略规则及.gitignore规则不生效的解决办法 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件 的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: # 此为注释 – 将被 Git 忽略 *.a       # 忽略所有 .a 结尾的文件 !lib.a    # 但 lib.a 除外 /TODO     # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO build/   

r语言之生成规则序列,规则序列函数及用法

在生成序列时,“:”的优先级最高 (1)从1到20的整数序列: > 1:20 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (2)用函数seq生成实数等差序列:(两种表示方法) seq(start,end,d)     start表示起点,end表示终点,d表示步长. > seq(1,20,2) [1] 1 3 5 7 9 11 13 15 17 19> seq(1,20,3)[1] 1 4 7 10 13 16 19 &g

变量命名规则------匈牙利命名规则!

几年以前,Charles Simonyi(他后来成为微软的著名程序员)设计了一种以前缀为基础的命名方法,这种方法后来称为"匈牙利表示法"以记念他.他的思想是根据每个标识符所代表的含义给它一个前缀.微软后来采用了这个思想,给每个标识符一个前缀以说明它的数据类型.因此,整型变量的前缀是n,长整型变量是nl,字符型数组变量是ca,以及字符串(以空类型结尾的字符数组)以sz为前缀.这些名字可能会非常古怪.比如说:lpszFoo表示"Foo"是一个指向以空字符为结尾的字符串的

Wireshark技巧-过滤规则和显示规则

Wireshark是一个强大的网络协议分析软件,最重要的它是免费软件. 过滤规则 只抓取符合条件的包,在Wireshark通过winpacp抓包时可以过滤掉不符合条件的包,提高我们的分析效率. 如果要填写过滤规则,在菜单栏找到capture->options,弹出下面对话框,在capture filter输入框内填写相应的过滤规则,点击下方的start 就生效了. 1.只抓取HTTP报文 tcp port 80 解析:上面是只抓取tcp 协议中80端口的包,大部分Web网站都是工作在80端口的,

CODE[VS]-判断浮点数是否相等-浮点数处理-天梯青铜

题目描述 Description 给出两个浮点数,请你判断这两个浮点数是否相等 输入描述 Input Description 输入仅一行,包含两个浮点数 输出描述 Output Description 输出仅一行,如果相等则输出yes,否则输出no. 样例输入 Sample Input 2.980000001 2.9800000000001 样例输出 Sample Output yes 数据范围及提示 Data Size & Hint 我们一般认为两个浮点数相等,当且当他们之间的误差不超过1e-

【java规则引擎】规则引擎RuleBase中利用观察者模式

(1)当RuleBase中有规则添加或删除,利用观察者模式实现,一旦有变动,规则引擎其他组件也做出相应的改变.(2)学习思想:当一个应用中涉及多个组件,为了实现易扩展,解耦思想.可以利用观察者模式实现.基于易变动的数据结构中加入监听者,监听者依据被监听者的变动动作,定义自己的动作.在监听者内部通知其他组件做出相应改变.实现面向对象的思想.组建之间实现了解藕. 一:被监听数据,也就是规则网络RuleBase的接口定义 1 package com.nonbankcard.commons.doorls

Nginx Rewrite 规则入门 伪静态规则

文件及目录匹配: -f 和 !-f 用来判断是否存在文件 -d 和 !-d 用来判断是否存在目录 -e 和 !-e 用来判断是否存在文件或目录 -x 和 !-x 用来判断文件是否可执行 正则表达式匹配: * ~ 为区分大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 flag标记有: last 相当于Apache里的[L]标记,表示完成 rewrite break 终止匹配, 不再匹配后面的规则 redirect 返回302临时重定向 地址栏会