簡體   English   中英

為什么C99中不包含定點類型?

[英]Why aren't fixed-point types included in C99?

值得慶幸的是, complex類型修飾符被引入C99標准。 我不明白為什么決定省略對定點運算的支持(特別是支持分數類型,如1.15 {signed}或0.32 {unsigned}),這些類型對於DSP編程是如此重要?

GCC是否通過擴展支持這些?

為了解決“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

定點數據值包含小數和可選的整數部分。 定點數據的格式各不相同,取決​​於目標機器。

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

它已被討論/提出(例如,在N938N953中 ),但那些論文僅提出它作為擴展,而不是主要標准的補充。 這些似乎導致它被納入N1169 ,這是TR 18037的草案(“支持嵌入式處理器的擴展”),但這不被認為是完整的(草案似乎沒有在相當的更新而)。

我的猜測(盡管這只是猜測)是它的工作可能會被放棄(至少暫時)以集中精力完成C11。 現在恢復工作是否可能取決於是否還有人仍然關心。 編寫和提交基於那些涵蓋更多細節的早期論文,提供更多支持證據等的論文,可能有助於重新啟動它(盡管我顯然無法保證任何事情)。

就像卡爾在評論中所說的那樣,定點與整數完全相同。 我想這個語言可以在mult / div之后添加一個功能來為你做縮放(這與指向VLA類型的指針大致相同:通過隱藏縮放算法來清理語法)但考慮到各種各樣的尺度和類型的混合(例如固定8.24倍固定24.8,或固定時間整數)人們想要使用定點,很難完全覆蓋它。

另一個主要問題是目的的區分。 固定點幾乎總是以犧牲正確性為代價來破解速度(因此滾動自己更容易)。 浮點運算,包括C99中的新復雜支持,適用於需要具有已知誤差范圍的嚴格結果,虛假溢出安全等等.C99復雜支持為您做的不僅僅是為您復制二進制代碼。 它隱藏了所有繁重的工作,以確保您的結果不會被角落案件破壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM