關於c語言中 g(G)的用法和精度問題

2021-10-09 10:40:32 字數 2245 閱讀 5638

格式說明符號g(g)在c標準中的說明是

翻譯過來就是

1.把輸出的值按照%e或者%f型別中輸出長度較小的方式輸出,僅當數值的指數小於-4或大於等於精度引數(預設值為6)時按%e(e)輸出(否則按%f輸出)。

2.(在選擇好輸出格式之後)尾部的零會被縮減。

3.(在選擇好輸出格式之後且0被縮減後)當小數點後面有乙個或多個數字時才顯示小數點。

下面是關於這些性質的演示

printf

("%g\n"

,0.00001);

printf

("%f\n"

,0.00001);

printf

("%e\n"

,0.00001);

printf

("%g\n"

,1234567.0);

printf

("%g\n"

,123456.0

);

輸出結果:

1e-005

0.000010

1.000000e-005

1.23457e+006

123456

預設的精度為6所以%f與%e都顯示了小數點後6位,這沒問題。

指數小於-4所以%g轉化將其成了指數輸出,並且省略掉了本該輸出在小數點後面的6個零,並在之後略掉了後面的小數點。如果減少乙個0讓指數變為-4,則%g將會以%f的形式輸出並省略掉後面無效的0.

1234567的指數等於預設的精度6,故被按%e處理,而123456的指數5小於6故按%f處理。這裡為什麼變成了1.23457是因為

%g的精度既指明了使用%e所需要的指數大小,也指明了最大有效數字位數。

下面是預設精度下的截斷演示

printf

("%g\n"

,0.0000123456789);

printf

("%e\n"

,0.0000123456789

);

輸出結果為

1.23457e-005

1.234568e-005

首先%e按照預設精度顯示小數點後6位,這沒問題。

對於%g,它按照預設的精度6從最大位開始截斷,也就是1.23456。然後消0去小數點(當然這裡沒有)。這裡的四捨五入是可能發生的,原理和用%.2f輸出1.555結果是1.55而3.555結果是3.56一樣,與浮點數的儲存機制有關。

接下來我們嘗試設定乙個精度,同時混用%e,%f的精度以及寬長限制為防止讀者混淆,看看輸出情況。

printf

("%.3g\n"

,110.1);

printf

("%010.2g\n"

,110.1);

printf

("%010.2e\n"

,110.1);

printf

("%.2e\n"

,110.1);

printf

("%.2f\n"

,110.1

);

輸出結果

110001.1e+002

01.10e+002

1.10e+002

110.10

這裡從下往上開始說明。

%.2e:指點數值變為科學計數法後(即1.101x10的正2次方),然後取小數點後兩位得1.10x10的正2次方。

%010.2g:010的解釋和上面是一樣的,都是把e與+算在字寬內。因為110.1的指數為2,>=指定精度2,故被轉化成1.101x100。然後2作為擷取精度從右往左擷取(可能是四捨五入。要做到真正的四捨五入應該使用round函式或者a = int(a*100+0.5)/100.0之類的演算法,這裡不多做討論)兩位數變成了1.1,最終得到1.1e+002。

%.3g:這裡因為指數2小於3,故被轉化為%f,同時從右往左擷取3位數輸出,即110

最後是總結:對於乙個使用%g轉化說明的數值,不管其是指數小於-4或者大於等於精度引數(未指定的情況下預設為6)被轉成了%e,還是不滿足上述條件變成%f,都會先根據2,3進行簡化。在簡化後根據精度引數擷取至最大有效數字位數(假如精度過大則不會補0使其強制變為精度確定的有效數字位數)。

%g運算子因為其能夠自動簡化輸出中多餘的0與小數點,常用於不指定輸出格式的輸出中

關於C語言中 和 的用法

是邏輯或,例子如下 1 2 3 4 5 6 表示式1 表示式2 如果表示式1是true或者表示式2是true,整條式子的結果就是true,否則是false inta 0 boolz a 0 a 0 這個例子中條件a 0,所以整條表示式的結果是true,如果表示式1的結果是true,那結果也是true...

關於C語言中 和 的用法

是邏輯或,例子如下 1 2 3 4 5 6 表示式1 表示式2 如果表示式1是true或者表示式2是true,整條式子的結果就是true,否則是false inta 0 boolz a 0 a 0 這個例子中條件a 0,所以整條表示式的結果是true,如果表示式1的結果是true,那結果也是true...

關於C語言中 和 的用法

先說左移 左移就是把乙個數的所有位都向左移動若干位,在c中用 運算子.例如 int i 1 i i 2 把i裡的值左移2位 也就是說,1的2進製是000.0001 這裡1前面0的個數和int的位數有關,32位機器,gcc裡有31個0 左移2位之後變成 000.0100,也就是10進製的4,所以說左移...