簡體   English   中英

除數時如何存儲C中的所有浮點值

[英]How to store all the floating value in C when dividing the number

在正常的 C 語言中,當除以一個數字時,結果數字是浮點值,但它在浮點后僅顯示 6 個小數位我想將小數點后的所有浮點數存儲在一個數字中我該怎么做這個例子:一般 22/7 = 3.142857142857142857....
但是 C 語言只存儲 3.142857 如何存儲浮點后出現的所有數字。

考慮十進制浮點格式。 浮點格式表示具有數字序列的數字,例如 3142857,以及告訴我們將小數點放在哪里的指數,即 3.142857。 鑒於此,我們可以看到您的計算機不可能存儲所有 22/7 的十進制數字,因為有無限多的數字,但您的計算機只有有限數量的 memory。 即使該格式存儲了一百萬位數字,也不足以存儲 22/7 的所有數字。

floatdouble常用的格式是二進制浮點格式。 它們存儲一系列二進制數字(位)和一個指數(和一個符號,+ 或 -)。 因此,除了只有有限的位數外,它們還會偏離十進制格式。 例如,雖然 3/10 可以用十進制格式精確表示,但我們用float表示它為 1.0011001100110011001101 2 ⋅2 -2 = 5,033,165 / 16,777,216 = 0.300000011920928955078125。

一般來說,由於各種理論原因,在計算機中進行完美的實數算術也是不可能的,盡管您可以從這樣一個事實開始,即實數的無窮類型大於無窮大的類型數字字符串的數量。

通過記錄分子和分母以將每個數字表示為分數,可以編寫對有理數進行算術運算的軟件。 然而,與所有數學一樣,計算機仍然有有限的限制,所以理性算術只能在有限的范圍內完成。

對於大多數目的,如果結合知識和技能使用double算術就足夠了。 您可以通過顯式請求打印更多 22/7 數字,例如printf("%.16g\n", 22./7); .

但是 C 語言僅存儲 3.142857是什么意思? C 存儲的遠不止這些,看看你可以在 c 中存儲多大的數字?

浮點數有一個指數(8 位 IEEE-754 標准浮點數,11 位雙精度數)和一個尾數(分別為 23 和 52 位浮點數和雙精度數)

只需使用正確的格式說明符打印值:

#include <stdio.h>

int main(void)
{
    printf("%f\n", 22. / 7);    // output --> 3.142857
    printf("%.25f\n", 22. / 7); // output --> 3.1428571428571427937015414
    return 0;
}

或詢問可以打印而不會丟失精度的小數位數:

#include <stdio.h>
#include <float.h>

int main(void)
{
    printf("%.*g\n", DBL_DECIMAL_DIG, 22. / 7);
    return 0;
}

Output:

3.1428571428571428

即使您使用的是袖珍計算器,也不是顯示器上的所有數字實際上都是“重要的”。 浮點數被比作海灘上的一小堆泥土:“每次你撿起一個並移動它,你就會撿起一點泥土,失去一點沙子。” 除了指數之外,每個浮點表示都有一定數量的數字可以表示,但您需要了解數學的實際執行方式。

暫無
暫無

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

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