- 編寫高質量代碼:改善C程序代碼的125個建議
- 馬偉 著
- 720字
- 2019-01-01 01:33:11
建議3-5:避免使用浮點數作為循環計數器
由于不同的系統具有不同的浮點數精度限制,為了使代碼保持良好的可移植性,我們應該堅決避免使用浮點數來作為循環計數器。
為了讓讀者更加深刻地了解使用浮點數作為循環計數器會產生的嚴重后果,接下來看一段示例代碼:
float x; for(x=100000001.0f;x<=100000010.0f;x+=1.0f) { printf("%f",x); }
在上面的代碼中,我們使用了一個非常大的浮點數(100000001.0f)來作為循環計數器,并且每循環一次就會使變量x增加1.0f。從表面上來看,上面的代碼應該會循環執行10次累加1.0f。
但實際情況并非如此,相對于浮點數(100000001.0f)而言,如果一個浮點循環計數器的增量太小,那么它就無法在它的精度下更改值。因此,在許多編譯器中,上面的這段代碼將會產生一個無限循環。例如在VC++2010中的運行結果如圖1-34所示。

圖1-34 在VC++2010中的運行結果
上面的示例代碼演示了以一個大的浮點數(100000001.0f)來作為循環計數器的情況。或許這個時候有人會想,如果換用一個小的浮點數作為循環計數器結果會怎樣呢?
帶著這個問題,我們繼續看下面的示例代碼:
float x; for(x=0.1f;x<=1.0f;x+=0.1f) { printf("%f\n",x); }
很顯然,上面的代碼使用了一個比較小的浮點數(1.0f)作為循環計數器,并且每循環一次變量x就會增加0.1f。但是在這里問題出現了,十進制的0.1用二進制表示是一個重復的無限循環小數,也就是說無法準確地使用二進制表示,它的精度會受損。如果在VC++2010中運行上面這段代碼,那么循環只會執行9次,如圖1-35所示。

圖1-35 在VC++2010中的運行結果
由上面的兩個示例代碼可以看出,不論是使用大的還是小的浮點數來作為循環計數器,都會導致出乎意料的結果。因此,我們應該避免使用浮點數作為循環計數器。如果必須這么做,我們也應該想辦法將其轉換成整數的形式進行。如下面的示例代碼所示:
float x; size_t i; for(i=1;i<=10;i+=1) { x=i/10.0f; printf("%f\n",x); }
推薦閱讀
- 案例式C語言程序設計
- 計算機圖形學編程(使用OpenGL和C++)(第2版)
- Python Deep Learning
- Java從入門到精通(第5版)
- Python機器學習經典實例
- ASP.NET 3.5程序設計與項目實踐
- Python:Master the Art of Design Patterns
- Python一行流:像專家一樣寫代碼
- 交互設計師成長手冊:從零開始學交互
- RESTful Web API Design with Node.js(Second Edition)
- Splunk Essentials
- HTML5程序設計基礎教程
- Kudu:構建高性能實時數據分析存儲系統
- Activiti權威指南
- Architecting Modern Java EE Applications