[問題] bool回傳問題

看板C_and_CPP作者 (secret)時間12年前 (2012/01/27 17:52), 編輯推噓1(109)
留言10則, 4人參與, 最新討論串1/1
※ [本文轉錄自 Grad-ProbAsk 看板 #1F8cY3yI ] 作者: itsart (secret) 看板: Grad-ProbAsk 標題: [理工] 程式問題 時間: Fri Jan 27 17:04:00 2012 台師資教的題目 z和y都是1 bool回傳的值應該是1呀 不懂為何跑出來是0 bool f3(float x, int y) { float z =0.0; for(int i=0;i<10;i++) z+=x; return(z==y); } int main(void) { cout<<5*f3(0.1,1); return(1); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.223.206.142

01/27 17:24, , 1F
z是float,y是int,要不要考慮把其中一個轉型態看看?
01/27 17:24, 1F

01/27 17:28, , 2F
我用C跑也是0耶,我比較過(float)1.0和(int)1 是相等的
01/27 17:28, 2F

01/27 17:29, , 3F
直接用cout << (1.0 == 1) 印出是1,用return居然是0
01/27 17:29, 3F

01/27 17:29, , 4F
why?
01/27 17:29, 4F

01/27 17:34, , 5F
用debug最常用的技巧吧,你先cout << (z==y)不要return看看
01/27 17:34, 5F

01/27 17:37, , 6F
我是在main裡直接用cout<<(z==y)印出是1的,沒有return
01/27 17:37, 6F

01/27 17:39, , 7F
然後原code搬到function call裡面用return會變0?
01/27 17:39, 7F

01/27 17:40, , 8F
是的
01/27 17:40, 8F

01/27 17:41, , 9F
那去C_and_CPP板問看看吧,這可能牽涉到很多不知名的層面。
01/27 17:41, 9F

01/27 17:42, , 10F
這就是浮點數的一個特性之一 寫程式時老師應該有教不要
01/27 17:42, 10F

01/27 17:43, , 11F
這樣子直接比較相等
01/27 17:43, 11F

01/27 17:44, , 12F
特別是跑迴圈累加過後的數值 他是有可能存在誤差
01/27 17:44, 12F

01/27 17:46, , 13F
不過它現在的問題是只有在function call return時會錯。
01/27 17:46, 13F

01/27 17:46, , 14F
不是全部都會錯,很詭異。
01/27 17:46, 14F
※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: itsart (61.223.206.142), 時間: 01/27/2012 17:52:30

01/27 18:17, , 15F
請love把你的部分貼一下吧
01/27 18:17, 15F

01/27 18:18, , 16F
原PO的問題是13戒中的7與11
01/27 18:18, 16F

01/27 18:18, , 17F
發文前請看一下
01/27 18:18, 17F

01/28 04:57, , 18F
原因是:0.1換成二進位為循環小數,會有捨位誤差,累加
01/28 04:57, 18F

01/28 04:57, , 19F
動作將使得捨位誤差愈來愈大。
01/28 04:57, 19F

01/28 11:09, , 20F
float和int 比 通常沒有好下場的...
01/28 11:09, 20F

01/31 09:00, , 21F
同樣好奇原po兩份結果不同的code各是怎麼寫的....
01/31 09:00, 21F

01/31 09:00, , 22F
比1.0==1, 跟比0.1加十次, 結果可能出乎你預料的不同XD
01/31 09:00, 22F

01/31 09:01, , 23F
理由就是板友說的浮點誤差; 另外個人猜測在某些case下,
01/31 09:01, 23F

01/31 09:02, , 24F
optimization與否可能也有影響....@_@"
01/31 09:02, 24F
文章代碼(AID): #1F8dFVbo (C_and_CPP)