3 回答

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
為了獲得正確的結(jié)果,請不要將精度設(shè)置為大于此數(shù)字類型可用的精度:
#include <iostream>
#include <limits>
int main()
{
double a = 0.3;
std::cout.precision(std::numeric_limits<double>::digits10);
std::cout << a << std::endl;
double b = 0;
for (char i = 1; i <= 50; i++) {
b = b + a;
};
std::cout.precision(std::numeric_limits<double>::digits10);
std::cout << b << std::endl;
}
盡管如果該循環(huán)運(yùn)行5000次迭代而不是50次迭代,則即使使用這種方法,也會(huì)顯示累積的錯(cuò)誤-這就是浮點(diǎn)數(shù)的工作方式。

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
為什么是這樣?
因?yàn)楦↑c(diǎn)數(shù)以二進(jìn)制形式存儲(chǔ),所以0.3表示0.01001100110011001 ...重復(fù),就像1/3表示0.333333 ...重復(fù)十進(jìn)制。當(dāng)您編寫時(shí)0.3
,您實(shí)際上得到0.299999999999999988897769753748434595763683319091796875(無窮大的二進(jìn)制表示形式四舍五入為53個(gè)有效數(shù)字)。
請記住,對于設(shè)計(jì)了浮點(diǎn)的應(yīng)用程序,可以精確地表示0.3并不是問題。浮點(diǎn)設(shè)計(jì)用于:
物理測量,通常只能測量到4 sig圖,而從不超過15。
對數(shù)和三角函數(shù)之類的先驗(yàn)函數(shù)無論如何都只是近似的。
與其他錯(cuò)誤源相比,二進(jìn)制十進(jìn)制轉(zhuǎn)換與之無關(guān)。
現(xiàn)在,如果您要編寫財(cái)務(wù)軟件,那么$ 0.30 恰好是 $ 0.30,那就不一樣了。有針對這種情況設(shè)計(jì)的十進(jìn)制算術(shù)類。
以及在這種情況下如何獲得正確的結(jié)果?
將精度限制為15個(gè)有效數(shù)字通常足以隱藏“噪聲”數(shù)字。除非您確實(shí)需要確切的答案,否則通常這是最好的方法。

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
計(jì)算機(jī)以二進(jìn)制而不是十進(jìn)制存儲(chǔ)浮點(diǎn)數(shù)。
許多在十進(jìn)制中看起來很普通的數(shù)字,例如0.3,都沒有二進(jìn)制形式的有限長度的精確表示。
因此,編譯器會(huì)選擇具有精確二進(jìn)制表示形式的最接近的數(shù)字,就像您為編寫0.33333的一樣1?3。
如果添加許多浮點(diǎn)數(shù),這些微小的差異加起來,就會(huì)得到意想不到的結(jié)果。
- 3 回答
- 0 關(guān)注
- 781 瀏覽
添加回答
舉報(bào)