2017-02-23 92 views
1

在數字界線什麼是真正的情況下,不C++ std::numeric_limits<float>::lowest()等於的std::numeric_limits<float>::max()浮動最低和最高

回答

2

std::numeric_limits<float>::lowest()將等於的std::numeric_limits<float>::max()負如果浮點表示使用signed magnitude,作爲最大值和最低值將具有相同的有效數字(忽略符號位)和指數,與二者均含有它們的最大值。符號位將決定數字是正數還是負數,並且不會影響數字的大小。 (另一個相同的結論是,底層表示將能夠表示正和負零。)IEEE 754使用帶符號的幅度表示,所以這是您在實踐中最有可能遇到的。

但是,替代表示法是使用two's complement有效數。二進制補碼的性質是最大負值具有比最大正值更大的幅度,並且因此對於使用二進制補碼有效數的浮點表示,std::numeric_limits<float>::lowest()將是而不是等於std::numeric_limits<float>::max()的負數。使用補一個真正的系統的一個例子有效位數的浮點格式爲IBM 1130,大約1970年

現在,cppreference.com確實狀態:

雖然它不是根本ç真正++浮動Poing的類型,一第三方浮點類型T可能存在,例如std::numeric_limits<T>::lowest() != -std::numeric_limits<T>::max()

但我不知道這種說法的依據是什麼,因爲C++ 11標準,段落18.3.2.4,僅僅規定了lowest()是:

有限值x這樣沒有其他有限值y其中y < x

有意義的所有專業is_bounded != false

它也注意到在腳註:

lowest()是必要的,因爲不是所有的浮點表示有一個最小的(最負)值是 負最大(最正)有限值。

所以它似乎是一個補浮點表示可以由C++實現使用,這將有std::numeric_limits<float>::lowest()不等於std::numeric_limits<float>::max()負。