簡體   English   中英

在 C 中添加和減去值

[英]adding and subtracting values in C

我在一次考試中得到了以下考題,如果有人能幫助解釋以下問題,我將不勝感激。

考慮以下代碼:

double a = 1.0, b = 1.0, c = 1.0e-16;
a += c;
a -= c;
b -= c;
b += c;

a 和 b 的值是什么?

A: a 和 b 都等於 1:0。

B:a 等於 1:0,b 小於 1:0。

C:a小於1:0,b等於1:0。

D:a小於1:0且b小於1:0。

首先,C 標准沒有定義浮點數的確切行為和准確性。 如果我們假設 IEEE-754 雙精度浮點數,那么可以說如下:

DBL_EPSILON (大約 2.2e-16)被定義為 1 和下一個更大的可表示數字之間的差值。 這意味着如果您至少將DBL_EPSILON / 2添加到 1.0,結果將更接近1.0 + DBL_EPSILON不是 1.0,因此結果不會是 1.0。 對於您的代碼, c小於DBL_EPSILON / 2 ,因此1.0 + c給出1.0

(注意:我在這里假設舍入模式是舍入到最接近的數字,這是大多數實現的默認值。其他舍入模式可能會給出不同的結果)。

當低於 2 的冪(例如 1.0)時,浮點數的密度會加倍。 這意味着 epsilon 的有效值下降到其值的一半。 所以DBL_EPSILON / 4將是最小值,當從 1.0 中減去時,將給出不同的結果。 由於c > DBL_EPSILON / 41.0 - c給出了不同的結果。

這樣做的結果是對a的第一次加法沒有效果,但減法會改變它,所以它最終會得到一個小於 1 的值。 b將受到兩個操作的影響,最終等於 1.0。

這是通過嘗試驗證的,給出:

a=0.99999999999999988898 b=1.00000000000000000000

暫無
暫無

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

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