3 回答

TA貢獻1860條經驗 獲得超9個贊
為了獲得正確的結果,請不要將精度設置為大于此數字類型可用的精度:
#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;
}
盡管如果該循環運行5000次迭代而不是50次迭代,則即使使用這種方法,也會顯示累積的錯誤-這就是浮點數的工作方式。

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

TA貢獻1757條經驗 獲得超8個贊
計算機以二進制而不是十進制存儲浮點數。
許多在十進制中看起來很普通的數字,例如0.3,都沒有二進制形式的有限長度的精確表示。
因此,編譯器會選擇具有精確二進制表示形式的最接近的數字,就像您為編寫0.33333的一樣1?3。
如果添加許多浮點數,這些微小的差異加起來,就會得到意想不到的結果。
- 3 回答
- 0 關注
- 780 瀏覽
添加回答
舉報