#16552: 請指教小的哪裡錯了?


chad910607 (謙哥)

學校 : 臺北市立大安高級工業職業學校
編號 : 71645
來源 : [36.224.248.137]
最後登入時間 :
2024-04-21 16:25:47
a647. 投資專家 | From: [220.133.253.33] | 發表日期 : 2019-01-13 19:29

 

#include <iostream>
#include <iomanip>
#include <cmath>

int main()
{
    int num;
    double inmon,value;
    double ans;
    const double wtf= 100.0f;

    while(std::cin>> num){
        while(num--){
            std::cin>> inmon>> value;
            ans= (value/inmon-1)*10000;
            ans= round(ans);
            ans= ans/wtf;

            std::cout<< std::fixed<< std::setprecision(2)<<
            ans<< "% "<< ((ans>-7&&ans<10)?"keep\n":"dispose\n");
        }
    }
}

 

錯在50%的第一題8.99%

兩個測資分別是20000 跟 21797

在自己的電腦進行是8.99但到了judge就變成8.98%了

 
#16555: Re:請指教小的哪裡錯了?


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
a647. 投資專家 | From: [49.158.83.43] | 發表日期 : 2019-01-13 21:34

由於本人跑您的程式也是出現 8.98% 的結果。推測是浮點數誤差跟 round() 函式的關係。

 

因為電腦儲存小數時,是用固定位元長的區塊且以二進位的方式儲存小數點。跟十進位有 4 / 3 = 1.333…… 一樣,二進位也有自己的循環小數,而資料又是固定長的,因此會有截斷的問題。也就導致了誤差。

 

而 round() 函式作用是取到最接近的整數部分(如果是 5.5 ,則會取成 6 ),而本人這邊跑 (21797 / 20000 - 1) * 10000 的結果為 898.4999999……,因此 round() 函式將其取整為 898

可以考慮將浮點數加上一個很小的誤差數字(例如 0.0000001 等),再去做 round() 跑出來才會是題目想要的結果。

 

關於更詳盡的,關於浮點數的資料可以自行 Google 或是從以下網址進去查閱:

 

http://edisonx.pixnet.net/blog/post/46103946-%5B%E6%B5%AE%E9%BB%9E%E6%95%B8%5D-ieee754-,-c-c++-%E6%B5%AE%E9%BB%9E%E6%95%B8%E8%AA%A4%E5%B7%AE

https://medium.com/pyladies-taiwan/%E7%B2%BE%E7%A2%BA%E7%9A%84%E6%B5%AE%E9%BB%9E%E6%95%B8%E9%81%8B%E7%AE%97-28d34e652e51

 

http://davidhsu666.com/archives/ieee-754/

 

以上,希望有幫助到您。

 
 
ZeroJudge Forum