簡體   English   中英

實數 - 如何確定是否需要 float 或 double?

[英]Real numbers - how to determine whether float or double is required?

給定一個實數,我們可以檢查float數據類型是否足以存儲數字,還是需要double float數?

我知道精度因架構而異。 是否有任何 C/C++ 函數來確定正確的數據類型?

有關背景信息,請參閱 每個計算機科學家都應該了解的關於浮點運算的知識

不幸的是,我認為沒有任何方法可以使決策自動化。

通常,當人們用浮點數而不是字符串表示數字時,其目的是使用數字進行算術運算。 即使所有輸入都以可接受的精度符合給定的浮點類型,您仍然必須考慮舍入誤差和中間結果。

在實踐中,使用 64 位類型,大多數計算都可以以足夠的精度獲得可用結果。 許多計算僅使用 32 位將無法獲得可用結果。

在現代處理器中,總線和算術單元的寬度足以提供 32 位和 64 位浮點相似的性能。 使用 32 位的主要動機是在存儲非常大的數組時節省空間。

這導致了以下策略:

如果數組大到足以證明花費大量精力將其大小減半是合理的,請進行分析和實驗以確定 32 位類型是否提供足夠好的結果,如果是,則使用它。 否則,使用 64 位類型。

我認為您的問題預設了一種在不損失精度的情況下為 C/C++(或任何其他程序)指定任何“實數”的方法。

假設您通過在代碼中指定或通過用戶輸入獲得這個實數; 檢查浮點數或雙精度數是否足以在不損失精度的情況下存儲它的方法是僅計算有效位的數量,然后根據浮點數和雙精度數的數據范圍進行檢查。

如果數字作為表達式給出(即1/7sqrt(2) ),您還需要檢測的方法:

此外,還有一些數字,例如0.9 , float / double 理論上不能“完全”表示))至少在我們的二進制計算范式中不是) - 請參閱Jon Skeet 對此的出色回答。

最后,請參閱有關 float 與 double 的其他討論。

精度不是很依賴平台。 盡管允許平台不同,但float幾乎是普遍的IEEE 標准單精度,double雙精度

單精度在小數點(小數點)后分配 23 位“尾數”或二進制數字。 由於點之前的位始終為 1,因此這相當於 24 位小數。 除以 log2(10) = 3.3,浮點數得到7.2 位十進制數的精度。

遵循相同的過程double產生 15.9 位數字和long double產生 19.2(對於使用 Intel 80 位格式的系統)。

除尾數外的位用於指數。 指數位數決定了允許的數字范圍。 單去~10 ±38 ,雙去~10 ±308

至於您是否需要 7、16 或 19 位數字,或者有限精度表示是否合適,這確實超出了問題的范圍。 這取決於算法和應用程序。

一個非常詳細的帖子,可能會也可能不會回答您的問題。

浮點復雜性的整個系列

您不能用 float 或 double 變量表示實數,而只能表示有理數的子集。

當您進行浮點計算時,您的 CPU 浮點單元將決定最適合您的近似值。

我可能錯了,但我認為 float(4 字節)和 double(8 字節)浮點表示實際上是獨立於 comp 架構指定的。

你不能簡單地將它存儲到一個float和一個double變量中,然后比較這兩者嗎? 這應該隱式地將float轉換回雙float - 如果沒有區別, float就足夠了嗎?

float f = value;
double d = value;
if ((double)f == d)
{
     // float is sufficient
}

暫無
暫無

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

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