为什么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
,_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
。定点数据值包含小数和可选的整数部分。 定点数据的格式各不相同,取决于目标机器。
您可以在此处找到提案草案的文本。
就像卡尔在评论中所说的那样,定点与整数完全相同。 我想这个语言可以添加一个function来在mult / div之后为你做缩放(这与指向VLA类型的程度大致相同:通过隐藏缩放算法来清理语法)但考虑到各种各样的尺度和类型的混合(例如固定8.24倍固定24.8,或固定时间整数)人们想要使用定点,很难完全覆盖它。
另一个主要问题是目的的区分。 固定点几乎总是以牺牲正确性为代价来破解速度(因此滚动自己更容易)。 浮点运算,包括C99中的新复杂支持,适用于需要具有已知误差范围的严格结果,虚假溢出的安全性等.C99复杂支持为您做的不仅仅是为您复制二进制代码。 它隐藏了所有繁重的工作,以确保您的结果不会被角落案件破坏。