值得庆幸的是,complex
类型修饰符被引入到 C99 标准中。我不明白的是为什么决定省略对定点算术的支持(具体来说,支持像 1.15 {signed} 或 0.32 {unsigned} 这样的小数类型),这些类型对于 DSP 编程如此重要?
GCC 是否通过扩展支持这些?
值得庆幸的是,complex
类型修饰符被引入到 C99 标准中。我不明白的是为什么决定省略对定点算术的支持(具体来说,支持像 1.15 {signed} 或 0.32 {unsigned} 这样的小数类型),这些类型对于 DSP 编程如此重要?
GCC 是否通过扩展支持这些?
为了解决“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
.定点数据值包含小数部分和可选的整数部分。定点数据的格式因目标机器而异。
您可以在此处找到提案草案的文本。
正如卡尔在评论中所说,定点实际上与整数完全相同。我想该语言可以在 mult/div 之后添加一个功能来为您进行缩放(这与指向 VLA 类型的指针大致相同:通过为您隐藏缩放算法来清理语法)但考虑到各种尺度和混合类型(例如,固定 8.24 乘以固定 24.8,或固定乘以整数)人们想要与定点一起使用,真的很难涵盖所有内容。
另一个主要问题是目的的区别。定点几乎总是以牺牲正确性为代价来提高速度(因此,您自己的滚动要容易得多)。浮点运算,包括 C99 中的新复数支持,适用于当您想要具有已知错误界限的严格结果、防止错误溢出等安全性时。C99 复数支持为您做的不仅仅是 FOIL'ing 您的复数二项式。 . 它隐藏了确保您的结果不会被极端案例破坏所涉及的所有繁重工作。