[問題] codeblock和VC studio執行結果不同

看板C_and_CPP作者 (少時大發!!)時間14年前 (2011/03/17 14:20), 編輯推噓5(5021)
留言26則, 10人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) codeblock 和 vc studio 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 一個浮點數去迭代運算 運算後結果不同 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> int main() { int i,j,M; double x1=0.123456789,mu1=4; M=162; for(i=0;i<M;i++) x1 = mu1 * x1 *(1-x1) ; printf("%f \n",x1); } 補充說明(Supplement): http://ppt.cc/Y;bl codeblock執行結果為0.227385 http://ppt.cc/Ovlx VC 執行結果為0.939642 我用過matlab去驗證 matlab答案為0.9396 想請問codeblock...怎麼會差這麼多 orz 謝謝 -- ∥ | ====人生オワタ\^o^/視力檢測==== ∥未 來 |︿ ︿  ︿ ︿ 看不見! ∥  ↖(。ω。) (⊙▽●) / ∥ ̄ ̄ C ) ( と □ ∪ ∪ ∪∪ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.92.107

03/17 14:21, , 1F
把 1 改成 1.0 ?
03/17 14:21, 1F

03/17 14:22, , 2F
%lf?
03/17 14:22, 2F

03/17 14:23, , 3F
怪了,這份程式碼拿去Linux用gcc編出來也是0.939642
03/17 14:23, 3F

03/17 14:24, , 4F
用C::B試過一二樓的方法,結果都沒有改變
03/17 14:24, 4F

03/17 14:34, , 5F
lf無效 orz
03/17 14:34, 5F

03/17 14:52, , 6F
4x(1-x)這個函式的多次迭代值會很受初始值影響...
03/17 14:52, 6F

03/17 14:53, , 7F
(這件事還滿有名的吧 @_@)
03/17 14:53, 7F

03/17 14:53, , 8F
所以也許是在哪裡有不容易注意到的浮點數運算問題...
03/17 14:53, 8F

03/17 15:12, , 9F
在迴圈中每次都印出值試試?
03/17 15:12, 9F

03/17 15:26, , 10F
謝謝樓上的建議!! 我把每次迴圈用fprintf到一個txt檔上去比對
03/17 15:26, 10F

03/17 15:28, , 11F
發現在前32次運算結果都相同 在i=33時開始出現差異(10^-6)
03/17 15:28, 11F

03/17 15:29, , 12F
因為式子是對小數點運算很敏感 之後就越差越多了@@
03/17 15:29, 12F

03/17 15:50, , 13F
gcc 加上 -mfpmath=sse 之後就會得到 0.939642 的結果
03/17 15:50, 13F

03/17 15:51, , 14F
387浮點運算器與SSE的結果是有微妙不同的
03/17 15:51, 14F

03/17 15:52, , 15F
而這個微妙的不同在迭代多次後產了了巨大誤差
03/17 15:52, 15F

03/17 18:30, , 16F
(樓上的話好像很重要?! 我推幾行廢文一下)
03/17 18:30, 16F

03/17 18:32, , 17F
117:怪了,這份程式碼拿去Linux用gcc編出來也是0.939642
03/17 18:32, 17F

03/17 18:34, , 18F
我:怪了,這份程式碼拿去 用gcc編出來也是0.227385
03/17 18:34, 18F

03/17 19:51, , 19F
回2樓:印象中%lf不是只在scanf()中有用在printf()%f、%lf
03/17 19:51, 19F

03/17 19:51, , 20F
不都一樣?
03/17 19:51, 20F

03/17 21:49, , 21F
在x64平台上gcc會預設使用SSE,現在linux大多都x64了
03/17 21:49, 21F

03/17 23:52, , 22F
這種錯要是發生在自己的code上真是難de....Orz
03/17 23:52, 22F

03/17 23:52, , 23F
不過以前還有碰過, release build被compiler直接把原本
03/17 23:52, 23F

03/17 23:53, , 24F
64 bit的變數cache在80 bit的FPU reg裡, 結果跟debug
03/17 23:53, 24F

03/17 23:53, , 25F
build跑出來的值不同; 這也是做某些conformance test時
03/17 23:53, 25F

03/17 23:53, , 26F
才會撞到的莫名其妙的問題....Orz
03/17 23:53, 26F
文章代碼(AID): #1DWQWf2t (C_and_CPP)