全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1505
推到 Plurk!
推到 Facebook!

截去誤差

答題得分者是:Royce520
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-12 17:43:48 IP:59.104.xxx.xxx 未訂閱
#include 
#include 
#include     using namespace std;    int main()
{
    bool a = (0.1 0.1 0.1)==0.3;
    cout<    麻煩了解的人可以解釋一下怎樣數值會出現這種情況&原因     
        
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-12 18:05:46 IP:61.70.xxx.xxx 未訂閱
您好: 請問您是要問什麼狀況? (0.1 0.1 0.1)==0.3 => true a=true 這樣不是很正常?
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-12 18:13:01 IP:59.104.xxx.xxx 未訂閱
(0.1 0.1 0.1)==0.3 => 正常要是true 不過編譯出來是 false 這好像是跟浮點數截去有關係~~但我不清楚是怎樣數值也會發生同樣情況~~ 原因是為什麼?? 謝謝
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-12 20:03:12 IP:210.243.xxx.xxx 未訂閱
syao 你好, 有三個原因跟這個現象有關: 第一、因為浮點數在電腦裡面的表示方式...有其特定的儲存方式 分為指數與對數部分... 因此有所謂有效位數的問題, 便存在一定 的表示誤差, ... float 跟 double 就不一樣. 第二、與編譯器與指定的編譯組態有關, 當編譯器再分析程式時, 碰到 0.1加三次與0.3 會給予不同的浮點表示(可能小數點後五位才出現差異) 再者, 以 Dev-C++來說, 它以 double 方式來定義與設定初值 bool b = (0.1+0.1+0.1) == 0.3; // 不同 而0.1加三次累積了誤差... 與0.3的浮點表示就不相同 bool b1 = (float)(0.1+0.1+0.1) == (flaot)(0.3); // 相同 第三、編譯器看到 double f1 = 0.3; 與 double f2= 0.3f; 有時候也會給予不一樣的浮點表示    在電腦計算中使用浮點數, 是要很小心的... 很容易在數值計算上產生誤差, 得到不對的結果...  <><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-12 20:16:34 IP:219.68.xxx.xxx 未訂閱
抱歉,之前沒看清楚是浮點數,要回時Royce520先回了,Royce520大人說的沒錯,浮點數會有這樣的問題,我們看起來數值是一樣的,但在電腦裡面記錄的會有精確度的問題。 以下在額外補充浮點數的表示法,你可以再實驗看看。 bool a = (float)(0.1 0.1 0.1)==0.3f;//相同 bool a = (float)(0.1 0.1 0.1)==0.3;//不相同 if (a) ShowMessage("asdf");
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-12 21:26:48 IP:59.104.xxx.xxx 未訂閱
    #include 
#include 
#include     using namespace std;    int main()
{        
    double i = 0.12345678912345678; //有效位  
    double j = 0.12345678912345677; //有效位  
    cout<    我看書上有說double有效位是15位數 , flaot有效位是7位數
但我搞不懂為什麼我上面我測試的小程式 double到17位數都還是有效位
flaot也有8位數??    這是跟系統 & 編譯器有關係嗎?? 還有所謂有效位數是從小數點後算起嗎 ??    謝謝         
        
系統時間:2024-05-18 23:00:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!