为什么C99中不包含定点类型?

值得庆幸的是, complex类型修饰符被引入C99标准。 我不明白为什么决定省略对定点运算的支持(特别是支持分数类型,如1.15 {signed}或0.32 {unsigned}),这些类型对DSP编程如此重要?

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

它已被讨论/提出(例如,在N938 , N953中 ),但那些论文仅提出它作为扩展,而不是主要标准的补充。 这些似乎已经导致它被纳入N1169 ,这是TR 18037的草案(“支持嵌入式处理器的扩展”),但这不被认为是完整的(并且草案似乎没有更新到而)。

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

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

§5.13定点类型

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

定点类型是:

  • short _Fract_Fractlong _Fractlong long _Fract
  • unsigned short _Fractunsigned _Fractunsigned long _Fractunsigned 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_Accumlong _Accumlong long _Accum
  • unsigned short _Accumunsigned _Accumunsigned long _Accumunsigned 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

定点数据值包含小数和可选的整数部分。 定点数据的格式各不相同,取决​​于目标机器。

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

就像卡尔在评论中所说的那样,定点与整数完全相同。 我想这个语言可以添加一个function来在mult / div之后为你做缩放(这与指向VLA类型的程度大致相同:通过隐藏缩放算法来清理语法)但考虑到各种各样的尺度和类型的混合(例如固定8.24倍固定24.8,或固定时间整数)人们想要使用定点,很难完全覆盖它。

另一个主要问题是目的的区分。 固定点几乎总是以牺牲正确性为代价来破解速度(因此滚动自己更容易)。 浮点运算,包括C99中的新复杂支持,适用于需要具有已知误差范围的严格结果,虚假溢出的安全性等.C99复杂支持为您做的不仅仅是为您复制二进制代码。 它隐藏了所有繁重的工作,以确保您的结果不会被角落案件破坏。