11

值得庆幸的是,complex类型修饰符被引入到 C99 标准中。我不明白的是为什么决定省略对定点算术的支持(具体来说,支持像 1.15 {signed} 或 0.32 {unsigned} 这样的小数类型),这些类型对于 DSP 编程如此重要?

GCC 是否通过扩展支持这些?

4

3 回答 3

11

为了解决“GCC 是否通过扩展支持这些”这个问题,我们可以引用“使用 GNU 编译器集合”(对于 GCC 版本 4.4.0 — 添加的要点以澄清)。(GCC 4.9.0 URL 等效项是Fixed Point — Using the GNU Compiler Collection (GCC),但该部分是 6.15 而不是 5.13。)

§5.13 定点类型

作为扩展,GNU C 编译器支持 ISO/IEC DTR 18037 的 N1169 草案中定义的定点类型。GCC 中对定点类型的支持将随着技术报告草案的变化而发展。任何目标的调用约定也可能发生变化。并非所有目标都支持定点类型。

定点类型有:

  • short _Fract, _Fract, long _Fract, long long _Fract,
  • unsigned short _Fract, unsigned _Fract, unsigned long _Fract, unsigned long long _Fract,
  • _Sat short _Fract, _Sat _Fract, _Sat long _Fract, _Sat long long _Fract,
  • _Sat unsigned short _Fract, _Sat unsigned _Fract, _Sat unsigned long _Fract, _Sat unsigned long long _Fract,
  • short _Accum, _Accum, long _Accum, long long _Accum,
  • unsigned short _Accum, unsigned _Accum, unsigned long _Accum, unsigned long long _Accum,
  • _Sat short _Accum, _Sat _Accum, _Sat long _Accum, _Sat long long _Accum,
  • _Sat unsigned short _Accum, _Sat unsigned _Accum, _Sat unsigned long _Accum, _Sat unsigned long long _Accum.

定点数据值包含小数部分和可选的整数部分。定点数据的格式因目标机器而异。

您可以在此处找到提案草案的文本。

于 2012-03-27T04:59:11.737 回答
11

它已被讨论/提出(例如,在N938N953中),但那些论文仅将其作为扩展提出,而不是对主要标准的补充。这些似乎导致它包含在N1169中,这是 TR 18037 的草案(“支持嵌入式处理器的扩展”),但这并不完整(并且该草案似乎没有在相当长的时间内更新尽管)。

我的猜测(尽管这只是一个猜测)是它的工作可能会被放弃(至少是暂时的)以专注于完成 C11。现在是否会恢复它的工作可能取决于周围是否还有人仍然关心。根据那些涵盖更多细节、提供更多支持性证据等的早期论文撰写和提交论文,可能有助于重新启动它(尽管我显然不能保证任何事情)。

于 2012-03-27T05:02:33.440 回答
0

正如卡尔在评论中所说,定点实际上与整数完全相同。我想该语言可以在 mult/div 之后添加一个功能来为您进行缩放(这与指向 VLA 类型的指针大致相同:通过为您隐藏缩放算法来清理语法)但考虑到各种尺度和混合类型(例如,固定 8.24 乘以固定 24.8,或固定乘以整数)人们想要与定点一起使用,真的很难涵盖所有内容。

另一个主要问题是目的的区别。定点几乎总是以牺牲正确性为代价来提高速度(因此,您自己的滚动要容易得多)。浮点运算,包括 C99 中的新复数支持,适用于当您想要具有已知错误界限的严格结果、防止错误溢出等安全性时。C99 复数支持为您做的不仅仅是 FOIL'ing 您的复数二项式。 . 它隐藏了确保您的结果不会被极端案例破坏所涉及的所有繁重工作。

于 2012-03-27T05:01:13.347 回答