1 前言
在DSP芯片的介绍中,我们常常会听到定点数运算、浮点数运算,那到底什么是定点数,什么是浮点数呢?为回答这个问题,本篇文章打算谈一谈定点数和浮点数的一些基本概念,在此之前作为预备知识,会先介绍一些关于原码、反码和补码的内容,然后介绍一下十进制数与二进制数之间的转化,最后再介绍定点数和浮点数。
2 什么是原码、反码和补码
2.1 原码表示法
2.2 反码表示法
2.3 补码表示法
2.4 小结
2.4 在计算机中为什么采用补码来进行存储
3 十进制的数和二进制数之间的转换
3.1 十进制的数转换为二进制数
3.2 二进制的数转换为十进制数
4 定点数和浮点数的概念
在用二进制存储数据时,如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”。
4.1 定点数
定点数的本质是小数,整数只是其表现形式,确定小数点的位置称为定标。常用的定点数有两种表示形式:
(1) 如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;
(2) 如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。
目前计算机中多采用定点纯整数表示,因此将定点数的运算简称为整数运算。
定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。
对于各种整型数据所能表达的数值范围如下:

4.1.1 定点数存储格式(Q格式)
4.1.2 定点数与浮点数之间的转换
定点数与浮点数转化时需要使用2^n的关系进行转化。
4.1.2.1 浮点数到定点数

4.1.2.2 定点数到浮点数

4.1.2.2 定点数到定点数

4.1.3 定点数能够表示的数值范围与精度
4.1.3 定点数的动态范围
4.1.3 定点数的算术运算
定点运算的硬件实现较为简单,功耗较小,主要注意的是数据的定标、溢出以及误差。
4.1.3.1 定点数加减运算
4.1.3.2 定点数乘法运算
4.1.1 定点DSP芯片
4.2 浮点数
4.2.1 科学计数法
比如123.45用十进制科学计数法表示为:1.234510^2
其中给出几个概念:1.2345称为尾数(有效数字的非正式说法),10为基数,2为指数(exponent,也称为阶码)。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。对于一个二进制的数,比如1011.01,用科学计数法可以表示为:1.011012^3。
小数部分占的位( bit)数愈多,数的有效数字愈多(有效数字指的是从左往右第一个不为0的数开始的数的位数),精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。换句话说就是,浮点数所能表示的范围取决于阶码;精度取决于尾数。
4.2.1 浮点数的存储格式
- 第一个域为符号域。其中 0 表示数值为正数,而 1 则表示负数。
- 第二个域为指数域。其中单精度数为 8 位,双精度数为 11 位。以单精度数为例,8 位的指数为可以表达 0 到 255 之间的 255 个指数值。但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为 127,而双精度数的偏差值为 1023。比如,单精度的实际指数值 0 在指数域中将保存为 127;而保存在指数域中的 64 则表示实际的指数值 -63。 偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -127 到 128 之间(包含两端)。我们后面还将看到,实际的指数值 -127(保存为 全 0)以及 +128(保存为全 1)保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在 -127 和 127 之间。
- 第三个域为尾数域,其中单精度数为 23 位长,双精度数为 52 位长。除了我们将要讲到的某些特殊值外,IEEE 标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用 23 位长的尾数域表达了 24 位的尾数。比如:对于单精度数而言,二进制的 1001.101(对应于十进制的 9.625)可以表达为 1.001101 × 23,所以实际保存在尾数域中的值为 0011 0100 0000 000 0000 0000,即去掉小数点左侧的 1,并用 0 在右侧补齐。
举例:
浮点数:+27.5
二进制:11011.1
指数式(754标准):1.10111*2^4,即尾数是1.10111,指数为4,符号位为0
因此符号域为0
指数域的值为4+127=131 对应二进制为:1000 0011
尾数域为10111 000000000000000000
因此在计算机中的单精度存储:

0100 0001 1101 1100 0000 0000 0000 0000 ,在DSP中的十六进制表示为0x41DC0000
将十六进制表示的浮点数转换成十进制,则首先要读出浮点数的数符s,阶码e,十进制尾数x,然后按照如下计算公式计算对应的十进制数:(-1)^s * (1 + x) * 2^(e – 127)
4.2.2 浮点数能够表示的数值范围与精度

4.2.2 浮点运算
5 总结
主要介绍了定点数和浮点数的一些基本概念。之后在嵌入式开发中再给出一些相关的实例哈~~~~
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225810.html原文链接:https://javaforall.net
