主要内容

金宝app支持定点数据操作

Stateflow®图表在仿真软件金宝app®模型有一个动作语言属性,它定义了用于定点数据计算的语法:

  • MATLAB®作为行动语言。

  • C作为行动语言。

有关详细信息,请参阅作为动作语言语法的MATLAB与C的区别

二进制运算

这个表总结了所有定点操作数的二进制操作的解释,根据它们的优先级顺序(0 =最高,9 =最低)。二元运算是左关联的,因此在任何表达式中,具有相同优先级的运算符从左到右计算。

活动

优先级

MATLAB作为动作语言

C语言作为行动语言

a ^

0

权力。不支持使金宝app用非2的整数次幂或非零偏差定义的定点操作数。指数操作数必须是一个值是非负整数的常量。

权力。通过清除使c位操作图表属性。看到使c位操作

a * b

1

乘法。对于使用不是2的整数次幂的斜率或非零偏差定义的定点操作数,请指定图表fimath对象与ProductMode设置为SpecifyPrecision看见乘法

乘法。不支持使金宝app用非零偏差定义的定点操作数。看到乘法

a / b

1

部门。不支持使金宝app用非2的整数次幂或非零偏差定义的定点操作数。看到部门

部门。不支持使金宝app用非零偏差定义的定点操作数。看到部门

a + b

2

加法。对于使用不是2的整数次幂的斜率或非零偏差定义的定点操作数,请指定图表fimath对象与SumMode设置为SpecifyPrecision看见加减法

附加看见加减法

a - b

2

扣除对于使用非2的整数幂或非零偏差的斜率定义的定点操作数,请指定图表fimath对象与SumMode设置为SpecifyPrecision看见加减法

减法,看到了吗加减法

a >

3.

比较,大于。看到定点数据的关系操作

比较,大于。不支持不金宝app匹配偏差的定点操作数。看到定点数据的关系操作

< b

3.

相比之下,不到。看到定点数据的关系操作

相比之下,不到。不支持不金宝app匹配偏差的定点操作数。看到定点数据的关系操作

a>=b

3.

比较,大于或等于。看到定点数据的关系操作

比较,大于或等于。不支持不金宝app匹配偏差的定点操作数。看到定点数据的关系操作

< = b

3.

比较,小于或等于。看到定点数据的关系操作

比较,小于或等于。不支持不金宝app匹配偏差的定点操作数。看到定点数据的关系操作

a==b

4

比较,等于。看到定点数据的关系操作

比较,等于。不支持不金宝app匹配偏差的定点操作数。看到定点数据的关系操作

a~=b

4

比较,不等于。看见定点数据的关系操作

比较,不等于。不支持偏差不匹配的定点操作数。请参阅金宝app定点数据的关系操作

一个= b !

4

不受支持金宝app的。使用操作a~=b看见定点数据的关系操作

比较,不等于。不支持偏差不匹配的定点操作数。请参阅金宝app定点数据的关系操作

< > b

4

不受支持金宝app的。使用操作a~=b看见定点数据的关系操作

比较,不等于。不支持偏差不匹配的定点操作数。请参阅金宝app定点数据的关系操作

& & b

8

逻辑。看到定点数据的逻辑操作

逻辑。看到定点数据的逻辑操作

a | | b

9

逻辑或。看到定点数据的逻辑操作

逻辑或。看到定点数据的逻辑操作

一元操作和动作

该表总结了所有的一元运算和定点操作数上的操作。一元操作:

  • 具有比二元运算符更高的优先级。

  • 是右关联的,因此在任何表达式中,它们都是从右向左求值的。

活动

MATLAB作为动作语言

C语言作为行动语言

~a

不受支持金宝app的。使用表达式一个= =(0,“喜欢”,)看见定点数据的逻辑操作

逻辑。通过清除使c位操作图表属性。看到定点数据的逻辑操作使c位操作

!

不受支持金宝app的。使用表达式一个= =(0,“喜欢”,)看见定点数据的逻辑操作

逻辑。看到定点数据的逻辑操作

——一个

负的。看到一元-

负的。看到一元-

+ +

不受支持金宝app的。使用表达式a=a+1

增量。相当于a=a+1

一个,

不受支持金宝app的。使用表达式a=a-1

减量。相当于a=a-1

分配操作

该表总结了定点操作数赋值运算的解释。

活动

MATLAB作为动作语言

C语言作为行动语言

a = b

简单的任务。

简单的任务。

a: b =

不受支持金宝app的。若要覆盖定点提升规则,请使用显式类型强制转换操作。看到类型转换操作

凌驾于定点晋升规则之上的特殊任务。看到在C图表中覆盖定点推广

+ = b

不受支持金宝app的。使用表达式a=a+b

相当于a=a+b

a - b =

不受支持金宝app的。使用表达式一个= a - b

相当于一个= a - b

* = b

不受支持金宝app的。使用表达式a=a*b

相当于a=a*b

a / b =

不受支持金宝app的。使用表达式一个= a / b

相当于一个= a / b

在C图表中覆盖定点推广

在使用C作为动作语言的图表中,一种简单的形式赋值a = b计算的中间值b根据定点提升规则。然后将此中间值转换为一个通过使用在线转换。看到定点操作的升级规则转换操作.当两种类型的偏差和斜率相等或都是2的幂时,简单赋值是最有效的。

相反,表单的特殊赋值a: b =初始时使用的类型覆盖此行为一个的值的结果类型b

  • 常数b转换为类型一个通过使用离线转换。

  • 表达式b最多可包含一个算术运算符(+-,或/).结果由在线转换决定。

  • 如果b包含除算术运算或常数之外的任何内容,则特殊赋值操作的行为类似于简单赋值操作().

使用特殊赋值操作:=当您想要:

请注意

使用特殊赋值操作:=可能导致生成的代码的效率低于使用常规定点提升规则生成的代码。

在定点添加中避免溢出

您可以使用特殊的赋值操作:=在对两个定点数执行算术运算时,避免溢出。例如,考虑一个计算总和的图表a + b在哪里一个= 2121 = 4095b= 1

假设:

  • 两个输入都是带有三个分数位的16位定点数字(typefixdt(1,16,3)).

  • 输出c一个有符号的32位定点数字有三个分数位(类型fixdt(1、32、3)).

  • 生产目标的整数字大小是16位。

因为目标整数的大小是16位,所以简单的赋值c = a + b将输入加为16位,然后将和转换为32位。中间结果是4096,作为一个类型fixdt(1,16,3)值,则会导致溢出。

相反,特殊任务c: = a + b在计算和之前,将输入强制转换为32位。4096的结果被安全地计算为一个类型fixdt(1、32、3)值不溢出。

提高定点分割的精度

您可以使用特殊的赋值操作:=在两个定点数相乘或除法时得到更精确的结果。例如,考虑一个计算比率的图表a / b在哪里一个= 2b= 3

假设:

  • 输入一个是一个有四个分数位的定点数(类型fixdt(1,16,4)).

  • 输入b是一个带有三个分数位的定点数(类型fixdt(1,16,3)).

  • 输出c是一个有符号的16位定点数字,有6个分数位(类型fixdt(1,16,6)).

输入对应于这些斜率和量化整数:

年代一个= 24一个= 32

年代b= 23b= 24。

简单的任务c = a / b首先计算一个中间值a / b根据定点促销规则。量化整数四舍五入到下限:

年代int年代一个/年代b= 2-4/2-3= 2-1

int一个/b= 32/24≈1

然后中间结果被转换为带有6个分数位的16位定点数字:

年代c= 2-6= 1/64

c年代intint/年代c= 2-1/2-6= 25= 32。

因此,实际世界的近似值为cVc年代cc= 32/64 = 0.5.此结果与2/3的实际值不是很好的近似值。

相反,特殊任务c: = a / b计算a / b直接作为一个有符号的16位定点数字和6个分数位。再一次,量化的整数四舍五入到一层:

年代c= 2-6= 1/64

c= (年代一个一个)/(年代c年代bb) = 128/3≈42。

因此,实际世界的近似值为cVc年代cc= 42/64 = 0.6563.这个结果较好地逼近了实际值2/3。

比较定点算法的结果

此示例显示了状态流程图中定点算法的各种实现之间的差异。该模型包含三个计算比率的图表a / b在哪里一个= 19岁,b= 24。两个输入都是带有一个小数位的16位定点数字(type)1) fixdt(16日).它们对应于这些斜率和量化整数:

$ S_\textt {a} = 2^{-1}, Q_\textt {a} = 38 $

$ S_\textt {b} = 2^{-1}, Q_\textt {b} = 48 $$

该模型计算的值a / b作为类型的浮点数1) fixdt(16日有三种不同的方式:

  • 使用MATLAB作为动作语言的图表中的类型转换操作。

  • 使用C作为操作语言的图表中的简单赋值操作。

  • 使用C作为操作语言的图表中的一种特殊赋值操作。

用MATLAB作为动作语言的图表的类型铸造

模型顶部的图表计算出的中间值a / b.中间值的量化整数四舍五入到最接近的整数:

$$S\uuxttt{int}=S\uxttt{a}/S\uxttt{b}=1$$

$$Q\uxttt{int}=Q\uxttt{a}/Q\uxttt{b}=38/48\约1$$

然后将中间值转换为有符号的16位定点数字c一个小数位:

$ S_\text {c} = 2^{-1} $

$ $ Q_ \ texttt {c} = S_ \ texttt {int} \ cdot Q_ \ texttt {int} / S_ \ texttt {c} = 2 & # xA; $ $

此图表的输出值为

$ $ \波浪号{V} _ \ texttt {c} = S_ \ texttt c {} \ cdot Q_ \ texttt {c} = 1, $ $

使用C作为操作语言的图表中的简单赋值

中间的图表还计算的中间值a / b.在这种情况下,中间值的量化整数四舍五入到一层:

$$S\uuxttt{int}=S\uxttt{a}/S\uxttt{b}=1$$

$$Q\uuxttt{int}=Q\uxttt{a}/Q\uxttt{b}=38/48\约为0$$

然后将中间值转换为有符号的16位定点数字c一个小数位:

$ S_\text {c} = 2^{-1} $

$ $ Q_ \ texttt {c} = S_ \ texttt {int} \ cdot Q_ \ texttt {int} / S_ \ texttt {c} = 0 & # xA; $ $

此图表的输出值为

$ $ \波浪号{V} _ \ texttt {c} = S_ \ texttt c {} \ cdot Q_ \ texttt {c} = 0。$ $

用C语言作为行动语言的图表中的特殊任务

模型底部的图表使用了表单的特殊赋值c: = a / b.除法的值直接计算为带有一个小数位的16位定点数字。量化的整数四舍五入到一层:

$ S_\text {c} = 2^{-1} $

$ $ Q_ \ texttt {c} = (S_ \ texttt {} \ cdot Q_ \ texttt{一})/ (S_ \ texttt c {} \ cdot& # xA; S_ \ texttt {b} \ cdot Q_ \ texttt {b}) = 19/12 \大约1。$ $

因此,该图表的输出值为

$ $ \波浪号{V} _ \ texttt {c} = S_ \ texttt c {} \ cdot Q_ \ texttt {c} = 0.5, $ $

与19/24=0.7917的浮点答案相比,这三个结果显示出精度损失。要将应用程序中的精度损失降至可接受的水平,请调整定点数据中的编码方案。

相关的话题