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