2009-11-29 74 views
2

據我知道浮點值的形式爲N * 2^E的,與C++標準在哪裏定義浮點類型的值範圍?

  • 浮動範圍爲N = - (2^23-1) - (2^23-1),和E = -126 - 127,
  • 雙範圍爲N = - (2^52-1) - (2^52-1),和e = -1022 - 1023

我一直在尋找通過C++標準,但未能找到標準指定的地方,或者強制將float,double和long double類型與其他(IEEE)標準中定義的範圍相關聯。我在3.9.1.8中發現的唯一相關事物是:

有三種浮點類型:float,double和long double。 double類型至少提供與float相同的精度,long double類型的精度至少與double相當。 float類型的值的集合是類型double的值集合的子集;類型double的值集合是long double類型的值集合的子集。浮點類型的值表示是實現定義的。

而且沒有提及該類型提供的最小範圍。

標準在哪裏/如何指定浮點類型的(最小?)值範圍?或者編譯器能夠自由選擇任何值範圍,並且仍然符合標準?

+0

https://docs.microsoft.com/en-us/cpp/c-language/type-float https://docs.microsoft.com/en-us/cpp/c-language/type-double – Andrew 2017-07-08 00:12:40

回答

1

就像整數數字限制一樣,從C標準導入float,doublelong double的限制。常數FLT_MAX,​​和LDBL_MAX的最小值爲1E+37。對於其*_MIN變體,最大值爲1E-37

+0

謝謝,正是我所期待的。 C標準確實對浮動範圍有一定的最低要求。例如,浮動應該能夠按照您所說的持有1E-37和1E37,並且1與下一個較大的可浮動浮動之間的差值應該是1E-5或更小。 – shojtsy 2009-11-29 22:21:23

6

你引用的是關於C++中浮點類型的所有保證。正如它所說的,它們的表示是實現定義的。

儘管如此,您仍然可以使用<limits>中的std::numeric_limits模板來查詢有關限制的信息以及這些類型是否爲IEC 559(IEEE 754)指定類型。

2

該標準沒有指定這樣的東西,因爲它們通常依賴於硬件並隨時間而變化。雖然今天32位被認爲是一個標準,但在10年內處理小於64位的內容可能看起來不合常理。

+0

浮點數的大小由IEEE定義,你的編譯器可能會選擇它自己的非標準浮點數defn,但它會告訴你。 – 2009-11-29 20:10:59

+1

我不確定我是否同意32位將變得「令人厭惡」的前提,即使是現在,8位處理器也在嵌入式領域看到了實質性的應用。 32位可能會長時間保持在手機設備的主流 – SingleNegationElimination 2009-11-29 20:48:21