簡體   English   中英

為什么 C99 標准的作者不為浮點類型的大小指定一個標准?

[英]Why don't the authors of the C99 standard specify a standard for the size of floating point types?

我注意到在 Windows 和 Linux x86 上,float 是 4 字節類型,double 是 8,但是 long double 在 x86 和 x86_64 上分別是 12 和 16。 C99 應該打破這些具有特定整體尺寸的障礙。

最初的技術限制似乎是由於 x86 處理器無法處理超過 80 位的浮點運算(加上 2 個字節來四舍五入),但為什么與 int 類型相比標准不一致? 他們為什么不至少進行 80 位標准化?

C 語言沒有指定各種類型的實現,因此它可以在盡可能廣泛的硬件上有效實現。

這也擴展到整數類型 - C 標准整數類型具有最小范圍(例如, signed char是 -127 到 127, shortint都是 -32,767 到 32,767, long是 -2,147,483,647 到 2,147,483,647,而long long是 -9,2203,7875到 9,223,372,036,854,775,807)。 對於幾乎所有目的,這就是程序員需要知道的全部內容。

C99 確實提供“固定寬度”整數類型,如int32_t - 但這些是可選的- 如果實現不能有效地提供這種類型,它不必提供它。

對於浮點類型,存在等效限制(例如, double必須具有至少 10 位十進制數字的精度)。

他們試圖(主要)適應預先存在的 C 實現,其中一些甚至不使用 IEEE 浮點格式。

int s 可用於表示抽象事物,如 id、顏色、錯誤代碼、請求等。在這種情況下, int s 不是真正用作整數,而是用作位集(= 容器)。 大多數情況下,程序員確切地知道他需要多少位,因此他希望能夠根據需要使用盡可能多的位。

另一方面, float是為非常特定的用途(浮點運算)而設計的。 您不太可能能夠精確地確定您的float需要多少位。 實際上,大多數情況下,您擁有的位越多越好。

C99 應該打破這些具有特定整體尺寸的障礙。

不,那些固定寬度的(u)int N _t類型是完全可選的,因為並非所有處理器都使用 2 的冪的類型大小。 C99 只要求定義(u)int_fast N _t(u)int_least N _t . 這意味着為什么標准與 int 類型不一致的前提是完全錯誤的,因為 int 類型的大小沒有一致性

許多現代 DSP 將 24 位字用於 24 位音頻。 甚至還有像卓然 ZR3800x 系列這樣的 20 位 DSP 或像ADAU1701這樣的28 位 DSP ,它允許在不削波的情況下轉換16/24位音頻。 許多 32 位或 64 位架構還具有一些奇數大小的寄存器,以允許在不溢出的情況下累加值,例如,具有40 位long的 TI C5500 / C6000和具有 80 位累加器的SHARC Motorola DSP5600x/3xx 系列也有奇數大小:2 字節短、3 字節整數、6 字節長。 過去,有很多架構具有其他字長,例如 12、18、36、60 位……以及許多使用符號大小補碼的 CPU 查看標准委員會關心的異國架構

C 旨在靈活地支持各種此類平台。 指定固定大小,無論是整數類型還是浮點類型,都違背了這一目的。 硬件中的浮點支持變化很大,就像整數支持一樣。 有使用十進制、十六進制或其他可能的基數的不同格式。 每種格式都有不同大小的指數/尾數,不同的符號/指數/尾數位置,甚至有符號格式。 例如,有些對尾數使用二進制補碼,而有些則對指數或整個浮點值使用二進制補碼。 您可以在這里看到許多格式但這顯然不是曾經​​存在的所有格式。 例如,上面的 SHARC 有一個特殊的 40 位浮點格式。 一些平台還對long double使用double-double 算法 也可以看看

這意味着您無法為所有平台標准化單一浮點格式,因為沒有一刀切的解決方案。 如果您正在設計 DSP,那么顯然您需要一種最適合您目的的格式,以便您可以攪動盡可能多的數據。 當 40 位格式對您的應用程序具有足夠的精度、更適合緩存並且需要的管芯尺寸要小得多時,就沒有理由使用 IEEE-754 binary64。 或者,如果您使用的是小型嵌入式系統,那么 80 位long double精度通常是無用的,因為您甚至沒有足夠的 ROM 來容納 80 位long double精度庫。 這就是為什么有些平台將long double限制為 64 位,如double

暫無
暫無

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

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