請(qǐng)教個(gè)問題:s7-200程序中,我用一個(gè)sm0.5(1秒時(shí)鐘脈沖)的脈沖上升沿對(duì)vd1000進(jìn)行浮點(diǎn)數(shù)加1.0循環(huán)累積,然后再對(duì)vd1000除以3600.0,即可得出設(shè)備運(yùn)行的小時(shí)數(shù)時(shí)間?,F(xiàn)在的問題是當(dāng)設(shè)備運(yùn)行時(shí)間累積到9321時(shí)就不再累積了,程序中發(fā)現(xiàn)vd1000的數(shù)據(jù)不再增加了。3600*9321=33555600,浮點(diǎn)數(shù)范圍為+1.175495e-38至+3.402823e+38,說明沒有超過此范圍,這是什么原因呢?
當(dāng)對(duì)vd1000加100.0循環(huán)累積時(shí),vd1000的數(shù)據(jù)又會(huì)增加了!
答:這個(gè)問題可以給出精確的數(shù)學(xué)解釋。
浮點(diǎn)數(shù)的精度與它的尾數(shù)有關(guān),其尾數(shù)為二進(jìn)制小數(shù)1.m,m為23位的小數(shù)。所以浮點(diǎn)數(shù)的精度為24位二進(jìn)制有效位數(shù)。2的24次方為16777216。
樓主用浮點(diǎn)數(shù)能計(jì)的最大的數(shù)是3600*9321=33555600,該數(shù)除以2為16777800,與2的24次方16777216非常接近。在33555600附近加1.0加不上去,不是因?yàn)楦↑c(diǎn)數(shù)不能表示更大的數(shù),而是在做加法的時(shí)候,兩個(gè)數(shù)的指數(shù)應(yīng)該相同,1.0和33555600.0相比太小了,比33555600.0的尾數(shù)最低位(也是浮點(diǎn)數(shù)的最低位)的值的一半還小,所以相加的時(shí)候1.0的值被四舍五入忽略掉了,以后的累加值都不會(huì)增大。
解決的方法:
改為雙整數(shù)的加法,雙整數(shù)的有效位數(shù)為32位,計(jì)小時(shí)數(shù)夠用了。