创建定点数据
此示例说明如何使用定点数值对象 fi 的基础知识。要将定点数据类型赋给数字或变量,请使用 fi 构造函数创建一个 fi 对象。您可以在 fi 构造函数中或通过使用 numerictype 和 fimath 对象来指定数值属性和数学规则。
示例设置
此示例使用的显示设置或预设项可能与您当前使用的不同。为确保运行此示例不会更改您当前的显示设置和预设项,示例会自动保存并还原它们。运行以下代码以捕获示例更改的任何显示设置或属性的当前状态。
originalFormat = get(0,'format'); format loose format long g
捕获 fi 显示和记录预设项的当前状态并将其重置为默认值。
fiprefAtStartOfThisExample = get(fipref); reset(fipref);
创建具有默认属性的定点数
要对具有默认定点属性的数字或变量赋予定点数据类型,请使用 fi 构造函数。产生的定点值称为 fi 对象。
例如,创建 fi 对象 a 和 b。fi 构造函数的第一个输入是值。
a = fi(pi)
a =
3.1416015625
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
b = fi(0.1)
b =
0.0999984741210938
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 18
系统显示默认定点属性。在构造 fi 变量时,您可以为这些属性指定自定义值。
默认 WordLength 为 16 位。如果未指定 FractionLength 属性,它会自动设置为符合以下条件的小数长度:该小数长度在避免溢出的同时为给定字长提供最佳精度,保留值的最高有效位。
指定符号性和字长属性
fi 构造函数的第二个和第三个输入分别指定符号性和字长(以位为单位)。
创建一个 8 位有符号 fi 对象。
a = fi(pi,1,8)
a =
3.15625
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 8
FractionLength: 5
创建一个 20 位无符号 fi 对象。
b = fi(exp(1),0,20)
b =
2.71828079223633
DataTypeMode: Fixed-point: binary point scaling
Signedness: Unsigned
WordLength: 20
FractionLength: 18
精度
软件在内部以指定的精度存储数据。然而,用双精度浮点变量初始化高精度定点变量可能无法提供您期望的分辨率。
例如,用值 0.1 初始化无符号 100 位定点变量,然后检查其二进制展开。
a = fi(0.1,0,100)
a =
0.1
DataTypeMode: Fixed-point: binary point scaling
Signedness: Unsigned
WordLength: 100
FractionLength: 103
bin(a)
ans = '1100110011001100110011001100110011001100110011001101000000000000000000000000000000000000000000000000'
0.1 的无限重复二进制展开在第 52 位截断。第 53 位是有效位,它会向上舍入到第 52 位。这是因为双精度浮点变量(默认 MATLAB® 数据类型)以 64 位浮点格式存储,1 位用于符号,11 位用于指数,52 位用于尾数加 1 个隐藏位。这会导致有效精度为 53 位。尽管双精度浮点具有非常大的范围,但其精度限制为 53 位。有关浮点算术的详细信息,请参考 Cleve Moler 所著的《使用 MATLAB 进行数值计算》第 1 章。
由于大多数定点处理器都以较小的精度存储数据,然后以较大的精度进行计算,因此您可能需要创建一个精度高于双精度浮点的 fi 对象。
例如,初始化一个 40 位无符号 fi 并使用全精度计算乘积。40 位操作数的全精度乘积为 80 位,其精度高于标准双精度浮点。
a = fi(0.1,0,40); bin(a)
ans = '1100110011001100110011001100110011001101'
b = a*a
b =
0.0100000000000045
DataTypeMode: Fixed-point: binary point scaling
Signedness: Unsigned
WordLength: 80
FractionLength: 86
bin(b)
ans = '10100011110101110000101000111101011100001111010111000010100011110101110000101001'
访问数据
可以通过多种方式访问数据,这些方式会映射到内置数据类型和二进制字符串。
例如,double(a) 返回 a 的双精度浮点真实值,量化为 a 的精度。
a = fi(pi); double(a)
ans =
3.1416015625
您也可以以双精度设置真实值。例如,将 a 的真实值设置为 e,量化为 a 的数值类型。
a.double = exp(1)
a =
2.71826171875
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
使用 storedInteger 函数以可用的最小内置整数类型(最多 64 位)返回存储整数。
storedInteger(a)
ans = int16
22268
存储的整数值与真实值之间的关系
在二进制小数点定标中,存储的整数值与真实值之间的关系为
还有斜率偏置定标,其关系为
其中
和
fi 的数学运算符适用于二进制小数点定标和实数值斜率偏置定标的 fi 对象。
其他数据格式
函数 bin、oct、dec 和 hex 分别以二进制、八进制、无符号十进制和十六进制字符串返回存储整数。
bin(a)
ans = '0101011011111100'
oct(a)
ans = '053374'
dec(a)
ans = '22268'
hex(a)
ans = '56fc'
您也可以使用这些函数从二进制、八进制、无符号十进制和十六进制字符串设置存储整数。
a.bin = '0110010010001000'a =
3.1416015625
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
a.oct = '031707'a =
1.6180419921875
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
a.dec = '22268'a =
2.71826171875
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
a.hex = '0333'a =
0.0999755859375
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
指定小数长度
如果未指定 FractionLength 属性,系统会计算该属性以在给定字长的情况下为值的量级提供最佳精度,同时避免溢出。您也可以在 fi 构造函数中直接将小数长度指定为第四个数值参量。
比较 a 的小数长度(显式设置为 0)与 b 的小数长度(设置为值的量级的最佳精度)。
a = fi(10,1,16,0)
a =
10
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 0
b = fi(10,1,16)
b =
10
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 11
a 和 b 的存储整数值不同,尽管其真实值相同。这是因为 a 的真实值是存储整数按 2^0 = 1 缩放,而 b 的真实值是存储整数按 2^-11 = 0.00048828125 缩放。
storedInteger(a)
ans = int16
10
storedInteger(b)
ans = int16
20480
使用名称-值对组参量指定属性
您可以通过将数值参量传递给 fi 构造函数来指定数值类型属性,如上所示。您也可以通过将属性名称作为字符串后跟属性值来指定属性。
a = fi(pi,'WordLength',20)a =
3.14159393310547
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 20
FractionLength: 17
数值类型属性
每个 fi 对象都有关联的 numerictype 对象。numerictype 对象存储关于 fi 对象的信息,包括字长、小数长度和符号性。
T = numerictype
T =
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 15
数值类型属性可以在创建对象时通过传入名称-值对组参量来修改。
T = numerictype('WordLength',40,'FractionLength',37)
T =
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 40
FractionLength: 37
您也可以在对象创建后对数值类型属性赋值。
T.Signed = false
T =
DataTypeMode: Fixed-point: binary point scaling
Signedness: Unsigned
WordLength: 40
FractionLength: 37
fi 对象的所有数值类型属性都可以通过传入 numerictype 对象来立即设置。举例而言,这允许您创建多个共享相同数值类型属性的 fi 对象。
a = fi(pi,'numerictype',T)a =
3.14159265359194
DataTypeMode: Fixed-point: binary point scaling
Signedness: Unsigned
WordLength: 40
FractionLength: 37
b = fi(exp(1),'numerictype',T)b =
2.71828182845638
DataTypeMode: Fixed-point: binary point scaling
Signedness: Unsigned
WordLength: 40
FractionLength: 37
您也可以将 numerictype 对象直接传递给 fi 构造函数。
a1 = fi(pi,T)
a1 =
3.14159265359194
DataTypeMode: Fixed-point: binary point scaling
Signedness: Unsigned
WordLength: 40
FractionLength: 37
真实值的显示
当显示真实值时,会显示最接近的双精度浮点值。双精度浮点可能并不始终能够表示高精度定点数的精确值。例如,8 位小数可以用双精度精确表示。
a = fi(1,1,8,7)
a =
0.9921875
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 8
FractionLength: 7
bin(a)
ans = '01111111'
100 位小数则无法精确表示。
b = fi(1,1,100,99)
b =
1
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 100
FractionLength: 99
当精确值为 1 - 2^-99 时,输出显示 1。
然而,fi 的内部表示会保留全精度。
bin(b)
ans = '0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'
显示预设项
使用 fipref 对象设置 fi 的显示预设项。使用 savefipref 函数在 MATLAB 会话之间保存显示预设项。
fi 对象的显示还受 format 函数的影响。在显示真实值时,您可以使用
format long g
以便显示尽可能多的精度。
示例清理
将示例更改的任何显示设置或预设项还原为其原始状态。
fipref(fiprefAtStartOfThisExample); set(0,'format',originalFormat); %#ok<*NOPTS,*NASGU>
有关详细信息
定点数值对象称为 fi,因为 J.H. Wilkinson 在其经典著作《Rounding Errors in Algebraic Processes》(1963) 和《The Algebraic Eigenvalue Problem》(1965) 中使用 fi 表示定点计算。
另请参阅
fi | fipref | savefipref | numerictype | storedInteger | bin | oct | dec | hex