2017-01-05 130 views
1

我嘗試以下代碼最小/最大整數和雙

#include <iostream> 
#include <limits> 
using namespace std; 
cout << numeric_limits<int>::min() << endl; 
cout << numeric_limits<int>::max() << endl; 
cout << numeric_limits<double>::min() << endl; 
cout << numeric_limits<double>::max() << endl; 

其輸出

-2147483648 
2147483647 
2.22507e-308 
1.79769e+308 

爲什麼是最小雙不(-1)倍的最大雙? Afaik用於整數,第一位用作符號(這可能是爲什麼最大整數的絕對值低於最小整數的絕對值,不是嗎?)。如何描述負面雙打,因爲對我來說,似乎沒有8個雙字節負責符號。直到現在,我讀到浮點數是對稱的。我不太明白這一點,因爲整數值也應該是對稱的!

有人可以解釋一個業餘愛好者嗎?

+0

https://en.wikipedia.org/wiki/IEEE_floating_point#Basic_and_interchange_formats – Danh

+0

IEEE-754浮點類型使用符號大小,而整數使用2的補碼 –

回答

3

對於整數類型,與您的看法相反,並不要求第一位表示符號。並且存在真實世界的表示,這絕對是不真實的。

至於整數類型可能具有不同幅度的最小值和最大值(即一個不是另一個的負值)的原因......使用當前編譯器的典型實現選擇是表示具有某個特定數字的整數類型的位。可能的不同值的數量(不同的可能的位值組合)是2增加到位數。因此,一個8signed char可以表示25628)不同的值,一個16位的int可以表示65536不同的值,一個32位的int可以表示14294967296不同的值。請注意,所有這些值都是偶數。其中一個可表示的值將爲零,這會留下奇數個其他不同的值。這意味着值必須翻倍(兩個不同的位模式表示相同的值)或[實踐中通常的實現選擇]最大值和最小值在幅度上不相等。順便說一句,這也是std::numeric_limits::max()通常爲無符號整型提供奇數值的原因。

至於浮點數,min()的規格是最小的正值(最小值的正值),max()是最大的。如果你想要從零開始的負值,使用(自C++ 11以來)std::numeric_limits<float>::lowest()

2

numeric_limits表現得像是:

  • 對於數值的數字:min和max是可能的值的範圍
  • 對於浮數字:min是最小的可能值,max是最大可能值

http://en.cppreference.com/w/cpp/types/numeric_limits/min

返回最小有限值可由數值類型T表示。 對於具有非規範化的浮點類型,min將返回最小值爲 的正規歸一化值。請注意,此行爲可能是意外的, 尤其是與整型類型的min行爲進行比較時。至 找到沒有小於此值的值,請使用 numeric_limits :: lowest。 min僅對有界類型有意義,對於無界無符號類型則爲 ,也就是說,表示無限負值集合的類型沒有有意義的最小值。

cout << numeric_limits<double>::lowest() << endl; 

會顯示您的預期(1.79769e+308