2013-06-12 48 views
27

爲什麼的numeric_limits :: min爲int返回一個負值,但是例如爲正值則爲int。浮動和雙重?爲什麼numeric_limits :: min爲int返回負值,而float/double值爲正值?

#include<iostream> 
#include<limits> 

using namespace std; 

int main() { 
    cout << "int: " << numeric_limits<int>::min() << " " 
     << "float: " << numeric_limits<float>::min() << " " 
     << "double: " << numeric_limits<double>::min() << "\n"; 
    return 0; 
} 

輸出:

int: -2147483648 float: 1.17549e-38 double: 2.22507e-308 

從cppreference:

返回由數值類型T.

最小有限的值可表示對於浮點類型的非規範化,最低返回最低 正面沒有正式價值。 請注意,此行爲可能是意想不到的, ,尤其是與整數類型的min行爲進行比較時。到 找到沒有小於它的值的值,使用 numeric_limits::lowest

min僅對有界類型有意義,對於無界無符號類型則爲 ,也就是說,表示無限值負值的 類型沒有有意義的最小值。

+0

對於浮點值,min被定義爲能夠被該類型準確表示的最小*正數*數。 –

回答

30

根據定義,對浮點型,min返回最小正值的類型可以編碼,而不是最低

如果您想要最低值,請改爲使用numeric_limits::lowest

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

至於爲什麼是這樣,我只能推測,標準委員會需要有一種方式來表示所有形式的極端值的所有不同的原生類型。在積分類型的情況下,只有兩種類型的極值:最大正數和最大負數。對於浮游物還有另一種:儘可能最小。

如果您認爲語義有點混亂,我同意。 C標準中的相關#define的語義以相同的方式混淆。

+0

感謝您的推測。它是有道理的,需要有關最小可能類型的信息。我發現它真的很奇怪,它們都是爲整數定義的,儘管它們返回相同的值。認爲也許有更深層次的原因。 – gnzlbg

+4

@gnzlbg:我不知道certian,但我懷疑有什麼更深的理由比簡單的「這就是C做的。」。 –

+0

你確定那個「最小正值」? OP的輸出對int來說看起來是負的,cppreference.com說「最小有限值」。我的編譯器(仍然)不符合C++ 11,所以我不能使用最低:-( – craq

5

這是不幸的,但在類似的名字背後完全不同的含義在於。這是有點從C繼承,其中DBL_MIN和INT_MIN具有相同的「問題」。

由於沒有太多可以做的事情,只要記住是什麼意思。

相關問題