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

看板C_and_CPP (C/C++)作者 (薩哈拉雅)時間13年前 (2012/11/30 16:46), 編輯推噓4(408)
留言12則, 4人參與, 最新討論串1/2 (看更多)
開發平台(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

11/30 18:33, , 1F
我稍把程式碼改過一下. http://codepad.org/mwULbPil
11/30 18:33, 1F

11/30 18:36, , 2F
這結果在 Code::Blocks(gcc4.4.1)全都是 0,DevC++(3.4.2)
11/30 18:36, 2F

11/30 18:36, , 3F
跑出來e=64, vc e=53, 應和 compiler 處理相關係較大吧?
11/30 18:36, 3F

11/30 18:39, , 4F
另一提,我覺得你的測試設計是有問題的, x=1.0, x*=2.0,
11/30 18:39, 4F

11/30 18:40, , 5F
不就很可能直接在 exp 上直接+1, 測不出 mantissa ?
11/30 18:40, 5F

11/30 18:48, , 6F
大概是因為判斷式被最佳化了吧。
11/30 18:48, 6F

11/30 18:58, , 7F
對了,還要再講一件事,事實上你的程式最後會跑到 ov.
11/30 18:58, 7F

11/30 19:00, , 8F
在 Nan / Inf 情況下, x!=x+1 結果會怎樣, 還是要看編譯器
11/30 19:00, 8F

11/30 19:51, , 9F
等等來研究 要出門 XD..先提一下 不會overflow的樣子 就實際
11/30 19:51, 9F

11/30 19:52, , 10F
跑的次數 只是在Exponent加上64次..似乎沒有overflow...
11/30 19:52, 10F

11/30 20:19, , 11F
他就是要測 mantissa 才做 x == x+1 的比較的...
11/30 20:19, 11F

11/30 21:03, , 12F
可以試試看改成 !(x == x + 1)
11/30 21:03, 12F
文章代碼(AID): #1Gk79YIj (C_and_CPP)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 2 篇):
文章代碼(AID): #1Gk79YIj (C_and_CPP)