[問題] C的precision判斷

作者: yuanchris1 (過往雲煙)   2014-07-18 01:33:04
最近在書上看到這程式碼,講電腦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)
這樣讓我覺得更奇怪了.....不懂為什麼換個編譯器就不一樣,
有人能解釋為什麼嗎? 感恩!
作者: LPH66 (-6.2598534e+18f)   2014-07-18 01:45:00
並不是一定 No, 而是某些值 Yes, 某些值 No是哪一種跟機器架構、浮點數運算、編譯器最佳化都有關
作者: azureblaze (AzureBlaze)   2014-07-18 10:42:00
disassembly 不然就記得不要這樣做就好了
作者: Killercat (殺人貓™)   2014-07-18 11:23:00
float的operator==的使用都該被列為禁止...
作者: x000032001 (版廢了該走了)   2014-07-18 16:30:00
置底13誡-11

Links booklink

Contact Us: admin [ a t ] ucptt.com