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

时间:2012-03-27 04:50:35

标签: c gcc c99 fixed-point

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

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

3 个答案:

答案 0 :(得分:9)

为了解决“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编译器支持N1169中定义的定点类型   ISO / IEC DTR 18037草案。对GCC中定点类型的支持将随之发展   技术报告草案的变更。任何目标的调用约定也可能会发生变化。不   所有目标都支持定点类型。

     

定点类型是:

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

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

您可以找到提案草案here的文字。

答案 1 :(得分:9)

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

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

答案 2 :(得分:0)

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

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