
上QQ阅读APP看书,第一时间看更新
2.3.3 IQ数据格式

图2-6 1/2 ×(-3/8)
IQ格式与浮点格式有相似的地方,但若把一个Uint16型数据赋给IQ15型,再转换回整型时,数值已经改变了。而先将Uint16型数据赋给float型,再使用语句temp=_IQ(float32)(浮点型转换为IQ15格式),转换回的整型数据和原始数据相同。
float型的固定长度为4B(32bit器件)。int型是简单地按照“0”“1”进行存储的,而float是把4个字节划分为“符号位”“指数位”“尾数位”(比如1.123123×10^32)。因为有指数位的存在,所以存储范围比int型大很多,但是这3个部分具有范围限制:单精度浮点型的有效数字长度为7位,数字2.1234567891×1014赋给float型后变为2.1234567×1014,该数字的无效范围为21345670000000~2134567999999999,可见其精确度不高。
IQMath是不是可以按照相似的方法理解呢?答案是肯定的。IQMath的IQ型分成了两个部分,整数位(包括符号位)和小数位。每个IQ都是long型,通过不同的位数定标(其实就是定小数点的位置)来实现不同精度的小数和取值范围。例如,IQ15就是用低15位来表示小数位,高16位来表示整数位。按照这个思路,把一个Uint16型直接赋给IQ15型也是很容易的,只要赋值后将IQ值向左移15位就可以。图2-7所示为小数的表达方式。

图2-7 小数表达方式