[問題] 兩種寫法的差異

看板C_and_CPP (C/C++)作者 (趴趴藍)時間16年前 (2009/07/28 19:24), 編輯推噓5(5016)
留言21則, 7人參與, 最新討論串1/2 (看更多)
小弟之前有發文詢問浮點數比較的問題 現在為了要解決這個問題我爬文之後學到把浮點數轉成字串再比較的方法 為了解決我的問題我實做了兩種方法 1.把原本的浮點數改成整數去做比較 2.把浮點數轉成字串去做比較 要比較的浮點數類型 => x.y 改成整數 => x.y * 10 = xy 方法1的部份code: ........... int a,b; int c[i] if(a = = b) c[i]=a; ........... 方法2的部份code: ........... char str1[4],str2[4]; double s1,s2; double c[i] sprintf(str1,"%2.1f",s1); sprintf(str2,"%2.1f",s2); if( (strcmp(str1,str2)) = = 0 ) c[i]=s1; ........... 兩種方法差別在比較這一部份 其他的東西都大同小異,但是兩種方法的執行時間差蠻多的 方法1執行不到5秒結果就出來了 方法2執行大約是36~40秒之間 我的疑問是兩種方法為什麼執行時間會相差那多? p.s: 我在跑方法2的時候跑太久還以為程式當掉了一直關掉找bug 結果找很久沒找到反而是因為尿急先放著回來結果就出來了...還正確無誤=.=" 懇請版友幫我解惑!!謝謝 -- 態度決定你的高度 你有多高? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.114.166.192

07/28 19:34, , 1F
fcn用起來只有一行 跑起來可不只一行
07/28 19:34, 1F

07/28 19:38, , 2F
不太懂為什float要轉字串再比
07/28 19:38, 2F

07/28 19:38, , 3F
float再怎麼慢可能也只是一個指令好幾個週期
07/28 19:38, 3F

07/28 19:39, , 4F
你先轉字串 這之間就不知道跑多少個指令
07/28 19:39, 4F

07/28 19:39, , 5F
接著字串比對又走訪整個陣列 當然慢= =
07/28 19:39, 5F

07/28 20:04, , 6F
string的處理本來就比基本型別速度慢上很多, 就像1F說的
07/28 20:04, 6F

07/28 20:05, , 7F
程式寫起來是一行func call, 背後要做都少事請disasm看.
07/28 20:05, 7F

07/28 20:07, , 8F
順便說, %2.1f, 就算整數不超過2位, 也可能放不下'\0'.
07/28 20:07, 8F

07/28 20:08, , 9F
順便回2F, 原po只是想用不同比較方法來避開float精確度
07/28 20:08, 9F

07/28 20:08, , 10F
問題不適合直接用 == 的case吧我猜....@_@"
07/28 20:08, 10F

07/28 20:20, , 11F
我跟2F的疑問好像一樣耶
07/28 20:20, 11F

07/28 21:22, , 12F
去看 #1AO_CbEU 這篇, 最近a大剛好回過....~_~
07/28 21:22, 12F

07/29 04:30, , 13F
沒錯!!我遇到的問題就是要避開精確度~我剛睡醒有想到一個
07/29 04:30, 13F

07/29 04:31, , 14F
新方法耶....把兩個浮點數轉成二進位碼去比較會比較快嗎?
07/29 04:31, 14F

07/29 04:32, , 15F
可以自己決定精準度然後又避開字串的處理
07/29 04:32, 15F

07/29 09:28, , 16F
樓上, 理論上不會~_~ 任何一個浮點數要儲存都可以會經過
07/29 09:28, 16F

07/29 09:28, , 17F
truncate後, 最後用32bit或64bit的空間儲存起來....
07/29 09:28, 17F

07/29 09:29, , 18F
所以浮點直接==不出來的, 32/64 bit的bit binary一樣比
07/29 09:29, 18F

07/29 09:30, , 19F
不出來; 何不把您的用途/值域直接貼上來討論算了~_~
07/29 09:30, 19F

07/29 10:40, , 20F
== 也是在比 bit 呀 XD
07/29 10:40, 20F

07/29 12:14, , 21F
別想了,float.h裡面有DBL_EPSILON,FLT_EPSILON等常數,請查閱
07/29 12:14, 21F
文章代碼(AID): #1ARk06st (C_and_CPP)
文章代碼(AID): #1ARk06st (C_and_CPP)