Re: [問題] Dev-C++ 4992版本

看板C_and_CPP (C/C++)作者 (薩哈拉雅)時間13年前 (2012/12/09 05:34), 編輯推噓1(103)
留言4則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《rifiz (薩哈拉雅)》之銘言: : 標題: [問題] Dev-C++ 4992版本 : 時間: Fri Nov 30 16:46:23 2012 : : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : : Dev-C++ 4992版本, C++ : : 平台是winXP 32bit : : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : 無 : : 問題(Question): : : 跑下面這段程式: : : double x = 1.0; : int p = 0 : while( x != x + 1) : { : x*=2; : ++p; : : printf("PreCheck:%d %lf -- %lf = %lf\n", (x != x + 1), x, x+1 ,x - : (x+1)); : if ( x == x + 1 ) break; : printf("\n\n"); : } : printf("%lf, %d\n",x,p); : : : 預期的正確結果(Expected Output): : : 理論上p最後的值是52 但是在DevC++ 上面跑出來是64 : : 把這段code拿到 codepad上面跑可以得到正確的答案 : : 請問是怎麼回事呢??? : : 另外那行印出來檢查的那行, 印出來的x以及x+1的值在52之後 x 跟 x+1的值的確會相等, : : 不知道為什麼這個判斷: x != x + 1 , 還是判斷成不相等, 我甚至把bit pattern : : 印出來, 的確是一模一樣, memcmp也是return 0, 就是見鬼的還是會output 64....XD : : 請各位先進幫忙解惑一下 謝謝 : : : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 114.43.210.30 : 推 EdisonX:我稍把程式碼改過一下. http://codepad.org/mwULbPil 11/30 18:33 : → EdisonX:這結果在 Code::Blocks(gcc4.4.1)全都是 0,DevC++(3.4.2) 11/30 18:36 : → EdisonX:跑出來e=64, vc e=53, 應和 compiler 處理相關係較大吧? 11/30 18:36 : 推 EdisonX:另一提,我覺得你的測試設計是有問題的, x=1.0, x*=2.0, 11/30 18:39 : → EdisonX:不就很可能直接在 exp 上直接+1, 測不出 mantissa ? 11/30 18:40 : → linotwo:大概是因為判斷式被最佳化了吧。 11/30 18:48 : 推 EdisonX:對了,還要再講一件事,事實上你的程式最後會跑到 ov. 11/30 18:58 : → EdisonX:在 Nan / Inf 情況下, x!=x+1 結果會怎樣, 還是要看編譯器 11/30 19:00 : → rifiz:等等來研究 要出門 XD..先提一下 不會overflow的樣子 就實際 11/30 19:51 : → rifiz:跑的次數 只是在Exponent加上64次..似乎沒有overflow... 11/30 19:52 : 推 LPH66:他就是要測 mantissa 才做 x == x+1 的比較的... 11/30 20:19 : → linotwo:可以試試看改成 !(x == x + 1) 11/30 21:03 最後測試結果是,把DevC++ 的最佳化打開結果反而正確 XD, 也試過樓上提到的一些方法 結果都是仍然是錯誤的, 所以這應該是一個Bug吧?? (用virtualbox裝了FreeBSD8, 此相同程式產生正確答案, 在不用任何最佳化選項下) 請問一下, 若是從compiler角度來看, 有辦法解釋這種錯誤的產生嗎?? 覺得很好奇的是 跑了64次測試迴圈仍然會停止, 若是以expression最佳化錯誤來看, 結果或許應該是 無窮迴圈......吧!? 請熟悉compiler跟浮點數的大大們給個想法吧!! 感謝~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.147.36 ※ 編輯: rifiz 來自: 114.37.147.36 (12/09 05:36)

12/09 06:12, , 1F
您可以考慮用新版本的編譯器? 您現在用應該是十年前版本了
12/09 06:12, 1F

12/09 21:12, , 2F
我也常常新版本OK 舊版本不行 的問題
12/09 21:12, 2F

12/10 10:06, , 3F
too old.
12/10 10:06, 3F

12/10 13:16, , 4F
用浮點數當迴圈控制變數,什麼鳥事情都有可能發生。
12/10 13:16, 4F
文章代碼(AID): #1Gmx9meq (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Gmx9meq (C_and_CPP)