簡體   English   中英

為什么FLT_MAX和FLT_MIN不是正的和負的無窮大,它們的用途是什么?

[英]Why are FLT_MAX and FLT_MIN not positive and negative infinity, and what is their use?

從邏輯上說,給定的浮點值的性質,a的最大和最小可表示的值float是正和負無窮大,分別。

那么,為什么沒有設置FLT_MAXFLT_MIN 我知道這是“標准要求的方式”。 但是, FLT_MAXFLT_MIN有什么用途 ,因為它們目前位於float的可表示數值范圍的中間 其他數字限制具有一些實用性,因為它們保證了比較(例如“無INT可以測試大於INT_MAX”)。 沒有這種保證,這些浮動限制有什么用?

C ++的一個激勵范例:

#include <vector>
#include <limits>

template<typename T>
T find_min(const std::vector<T> &vec)
{
    T result = std::numeric_limits<T>::max();
    for (std::vector<T>::const_iterator p = vec.start() ; p != vec.end() ; ++p)
        if (*p < result) result = *p;
    return result;
}

如果T是整數類型,則此代碼可以正常工作,但如果它是浮點類型則不行。 這很煩人。 (是的,標准庫提供min_element ,但這不是重點。重點是模式 。)

FLT_MAXFLT_MAX (9)節中定義為

最大可表示的有限浮點數

正無窮大不是有限的。

FLT_MINFLT_MIN (10)節中定義為

最小歸一化正浮點數

負無窮大既不正常也不正。

的目的FLT_MIN / MAX是想告訴大家的最小和最大可表示浮點數是什么。 無限不是一個數字; 這是一個限制。

FLT_MAX或FLT_MIN有什么用途,因為它們目前位於float的可表示數值范圍的中間?

它們不位於中間或可表示的范圍內。 沒有正浮點值x ,您可以將其添加到FLT_MAX並獲得可表示的數字。 你會得到+ INF。

如果T是整數類型,則此代碼可以正常工作,但如果它是浮點類型則不行。 這很煩人。 (是的,標准庫提供min_element,但這不是重點。重點是模式。)

它怎么不“工作正常?” 它為您提供最小的價值。 它不能“正常工作”的唯一情況是表格包含+ INF。 即使在這種情況下,它也會返回一個實際數字 ,而不是錯誤代碼。 無論如何,這可能是更好的選擇。

我會說你看到的破碎模式只是C中命名不佳的人工制品,而在帶有numeric_limits和模板的C ++中,它是一個實際的語義缺陷,它破壞了想要處理整數和浮點值的模板代碼。 當然你可以編寫一些額外的代碼來測試你是否有整數或浮點類型(例如if ((T)1/2) /* floating point */ else /* integer */ )並且問題是遠。

至於為什么有人會關心FLT_MINFLT_MAX給你的值,它們對於避免下溢和溢出很有用。 例如,假設我需要計算sqrt(x²-1) 這對於任何大於或等於1的浮點x都是明確定義的,但是當x很大時,執行平方,減法和平方根很容易溢出並使結果無意義。 有人可能想測試x > FLT_MAX/x是否以其他方式處理這種情況(例如簡單地返回x :-)。

與整數類型不同,浮點類型(幾乎?)普遍對稱為零,我認為C浮點模型需要這個。

在二進制補碼系統(即幾乎所有現代系統)上, INT_MIN-INT_MAX-1 ; 在其他系統上,它可能是-INT_MAX (Qibble:如果最低可表示值被視為陷阱表示,則二進制補碼系統可以使INT_MIN等於-INT_MAX 。)因此INT_MIN傳達INT_MAX本身不存在的信息。

最小正值的宏不會特別有用; 那只是1。

另一方面,在浮點中,具有最大幅度的負值僅為-FLT_MAX (或-DBL_MAX ,或-LDBL_MAX )。

至於為什么他們沒有無限,還有已經代表無限值(至少在C99)的方式:宏觀INFINITY 這可能會導致某些C ++應用程序出現問題,但這些應用程序是為C定義的,它沒有像std::numeric_limits<T>::max()

此外,並非所有浮點系統都具有無窮大(或NaN)的表示。

如果FLT_MAXINFINITY (在支持它的系統上),則可能需要另一個宏來表示最大的可表示實際值。

暫無
暫無

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

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