亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++浮點精度

C ++浮點精度

C++ C
白衣染霜花 2019-10-21 14:55:29
double a = 0.3;std::cout.precision(20);std::cout << a << std::endl;結果:0.2999999999999999889double a, b;a = 0.3;b = 0;for (char i = 1; i <= 50; i++) {  b = b + a;};std::cout.precision(20);std::cout << b << std::endl;結果:15.000000000000014211因此,“ a”小于應有的大小。但是,如果我們將“ a”取50倍,結果將大于應有的結果。為什么是這樣?以及在這種情況下如何獲得正確的結果?
查看完整描述

3 回答

?
慕碼人2483693

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次迭代,則即使使用這種方法,也會顯示累積的錯誤-這就是浮點數的工作方式。


查看完整回答
反對 回復 2019-10-21
?
拉風的咖菲貓

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個有效數字通常足以隱藏“噪聲”數字。除非您確實需要確切的答案,否則通常這是最好的方法。


查看完整回答
反對 回復 2019-10-21
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

計算機以二進制而不是十進制存儲浮點數。


許多在十進制中看起來很普通的數字,例如0.3,都沒有二進制形式的有限長度的精確表示。

因此,編譯器會選擇具有精確二進制表示形式的最接近的數字,就像您為編寫0.33333的一樣1?3。


如果添加許多浮點數,這些微小的差異加起來,就會得到意想不到的結果。


查看完整回答
反對 回復 2019-10-21
  • 3 回答
  • 0 關注
  • 780 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號