[問題] C的precision判斷

看板C_and_CPP作者 (過往雲煙)時間10年前 (2014/07/18 01:33), 10年前編輯推噓1(104)
留言5則, 4人參與, 最新討論串1/1
最近在書上看到這程式碼,講電腦bit儲存的概念, #include <stdio.h> int main() { float a; a=1.0/3.0; if(a+a+a==1.0) printf("Equal"); else printf(Not Equal"); return 0; } 照理說(書上),答案會是Not equal, 但我用orwell dev c++ 5.6.3去跑,竟然會顯示Equal! 一路測試到a=1.0/10.0才顯示Not Euqal, 在測試幾個,1除以10以上就幾乎都會顯示Not Equal(當然16會是Equal) 覺得超奇怪,想說會不會是編譯器出問題, 編譯器原本用64bit,改成32bit後, 竟然會顯示not equal了!(也就是1/3+1/3+1/3不等於1) 這樣讓我覺得更奇怪了.....不懂為什麼換個編譯器就不一樣, 有人能解釋為什麼嗎? 感恩! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.137.33.102 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1405618387.A.7EB.html

07/18 01:45, , 1F
並不是一定 No, 而是某些值 Yes, 某些值 No
07/18 01:45, 1F

07/18 01:46, , 2F
是哪一種跟機器架構、浮點數運算、編譯器最佳化都有關
07/18 01:46, 2F
照理說 1/2 1/4 1/8 這些都會是被正確記下的,而1/3應該就會有近似的問題, 但竟然64bit會有很多例外,10以下他都顯示Equal,10~14顯示Not Equal, 15又顯示Equal,我就找不出解釋的原因QQ ※ 編輯: yuanchris1 (220.137.33.102), 07/18/2014 10:21:06

07/18 10:42, , 3F
disassembly 不然就記得不要這樣做就好了
07/18 10:42, 3F

07/18 11:23, , 4F
float的operator==的使用都該被列為禁止...
07/18 11:23, 4F

07/18 16:30, , 5F
置底13誡-11
07/18 16:30, 5F
文章代碼(AID): #1Jo0ZJVh (C_and_CPP)