Maciek905 | Dreamstime.com
代码编程促销

处理在ADA中使用定点的缺失FPU

5月28日,2021年
如果没有浮点单元,则固定点可以明显更快。

这篇文章是嵌入式软件系列:ADA为嵌入式C开发人员

许多数值应用程序通常使用浮点类型来计算值。然而,在某些平台上,浮点单元可能是不可用的。其他平台可能有浮点单元,但在某些数值算法中使用它可能会在性能方面受到限制。对于这些情况,定点算法是一种很好的选择。

当查看以下代码段时,定点类型和浮点类型之间的区别可能不是那么明显:

-  fixed_definitions.ads包固定_definitions是d:常量:= 2.0 **(-31);类型固定为Delta D范围-1.0 .. 1.0  -  D;结束固定_definitions;-  show_float_and_fixed_point.adb与ada.text_io;使用ada.text_io;用固定_definitions;使用fixed_definitions;过程show_float_and_fixed_point是float_value:float:= 0.25;fixed_value:固定:= 0.25;begin float_value:= float_value + 0.25; Fixed_Value := Fixed_Value + 0.25; Put_Line (“Float_Value = “ & Float’Image (Float_Value)); Put_Line (“Fixed_Value = “ & Fixed’Image (Fixed_Value)); end Show_Float_And_Fixed_Point;
在本例中,应用程序将显示Float_Value和Fixed_Value的值为0.5。

浮点和定点类型之间的主要区别在于存储值的方式。实际上,普通固定点类型的值缩放整数。用于普通固定点类型的缩放由类型的小(比例因子)定义,该类型来自指定的增量,默认情况下是两个的功率。

因此,普通的定点类型有时被称为二进制固定点类型。从这种意义上讲,可以认为普通的定点类型靠近机器上的实际表示。实际上,普通的定点类型可以使用可用的整数换档指令。

浮点和定点类型之间的另一个区别是,Ada不提供标准的定点类型——Duration类型除外,它用于表示以秒为单位的时间间隔。虽然Ada标准指定了Float和Long_Float等浮点类型,但我们必须声明自己的定点类型。注意,在前面的例子中,我们使用了名为“Fixed:”的定点类型。该类型不是标准的一部分,但必须在应用程序的源代码中声明它。

普通定点类型的语法是:

type(type_name)是delta(delta_value)范围(depart_bound)..(Upper_bound);

默认情况下,编译器将选择比例因子或小型,这是2的功率超过

例如,我们可以如下定义-1.0和1.0之间的标准化范围:

- 具有ada.text_io的Irandalized_fixed_point_type.adb;使用ada.text_io;过程归一化_fixed_point_type是d:常量:= 2.0 **(-31);TQ31型是Delta D范围-1.0 .. 1.0  -  D;begin Put_Line ("TQ31 requires " & Integer’Image (TQ31’Size & " bits"); Put_Line ("The delta value of TQ31 is " & TQ31'Image (TQ31'Delta)); Put_Line ("The minimum value of TQ31 is " & TQ31'Image (TQ31'First)); Put_Line ("The maximum value of TQ31 is " & TQ31'Image (TQ31'Last)); end Normalized_Fixed_Point_Type;

输出是:

TQ31需要32位TQ31的Δ值为0.000000000005 TQ31的最小值为0.0000000000,TQ31的最大值为0.9999999995
在此示例中,我们为归一化范围定义了32位固定点数据类型。运行应用程序时,我们会注意到上限接近一个,但不是完全的。这是固定点数据类型的典型效果 - 您可以在此讨论中找到更多详细信息,了解Q格式。

在C的情况下,由于语言不支持定点算术,我们需要使用整数类型和通过函数进行自定义操作来模拟它。让我们来看看这个非常基本的例子:

——main. c# include (stdio.h) #include (math.h) #define SHIFT_FACTOR 32 #define TO_FIXED(x) ((int) ((x) * pow (2.0, SHIFT_FACTOR - 1)) #define TO_FLOAT(x) ((float) ((double)(x) * (double)pow (2.0, -(SHIFT_FACTOR - 1))))) typedef int fixed;固定添加(固定a,固定b){返回a + b;} fixed mult (fixed a, fixed b) {return (fixed)(((long)a * (long)b) >> (SIFT_FACTOR - 1));} void display_fixed(fixed x) {printf("value (integer) = %d\n", x);printf(“价值(浮动)= % 3.5 f \ n \ n”,TO_FLOAT (x));} int main(int argc, const char * argv[]) {int fixed_value = TO_FIXED(0.25);printf("原始值\ n”);display_fixed (fixed_value);printf("……+ 0.25 \ n”); fixed_value = add(fixed_value, TO_FIXED(0.25)); display_fixed(fixed_value); printf("... + 0.5\n"); fixed_value = add(fixed_value, TO_FIXED(0.5)); display_fixed(fixed_value); return 0; }

在这里,我们声明了固定点类型基于INT和IT的两个操作来固定:添加(通过ADD功能)和乘法(通过MULL函数)。请注意,虽然固定点添加非常简单,乘法需要右移以匹配正确的内部表示。在ADA中,由于定点操作是语言规范的一部分,因此不需要模仿它们。因此,程序员不需要额外的努力。

还要注意的是,上面的示例非常简单,所以它没有考虑定点运算的一些副作用。在C中,您必须手动考虑定点运算产生的所有副作用,而在Ada中,编译器负责为您选择正确的操作。

从中阅读更多嵌入式软件系列:ADA为嵌入式C开发人员

从我们的合作伙伴

双端口USB Type-C™和USB PD控制器,具有集成电源开关

双端口USB Type-C™和USB PD控制器,具有集成电源开关

USB Type-C®和USB电力交付

我们广泛提供的USB Type-C®设备和PD控制器的USB PD能力提供了灵活性和集成所需的设计和实现…

理解和使用e - stop

问:什么是e-stop以及它如何使用?答:E-STOP或紧急停止开关,用于确保机器以及人员安全。他们是使用......

网络研讨会:电力诚信的基本原理

现在可根据需求提供。权力完整性涉及从生成到消费的权力质量。高功率完整意味着噪音...

并非所有分发盒都是平等的

如果在温度和空气湿度波动的环境中使用密封外壳,当水蒸气聚集时可能会出现冷凝问题。

USB Type-C™和USB PD控制器,具有集成电源开关

TPS65987D USB Type-C®和USB PD控制器,具有集成源和宿电源路径支持USB3和备用模式数据表(Rev. C)

声音你的意见!

本网站要求您注册或登录以发表评论。
目前还没有任何评论。想开始对话吗?

从我们的合作伙伴

双端口USB Type-C™和USB PD控制器,具有集成电源开关

双端口USB Type-C™和USB PD控制器,具有集成电源开关

USB Type-C®和USB电力交付

我们广泛提供的USB Type-C®设备和PD控制器的USB PD能力提供了灵活性和集成所需的设计和实现…

理解和使用e - stop

问:什么是e-stop以及它如何使用?答:E-STOP或紧急停止开关,用于确保机器以及人员安全。他们是使用......

网络研讨会:电力诚信的基本原理

现在可根据需求提供。权力完整性涉及从生成到消费的权力质量。高功率完整意味着噪音...

并非所有分发盒都是平等的

如果在温度和空气湿度波动的环境中使用密封外壳,当水蒸气聚集时可能会出现冷凝问题。
系统

超宽带SoC高集成度,低功耗

1月7日,2022年
MKSemi的旗舰产品将为超宽带在消费和工业物联网应用中的广泛部署铺平道路。与英飞凌和ThinkSeed Systems的合作关系服务于……
alt.embedded.

CES 2022虚拟和亲自

1月7日,2022年
今年的消费电子展规模较小,但也有很多虚拟组件。
Baidu