官术网_书友最值得收藏!

建議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);
}

主站蜘蛛池模板: 洪雅县| 菏泽市| 大名县| 通城县| 理塘县| 曲沃县| 南阳市| 饶平县| 达孜县| 景东| 左云县| 昌图县| 芦山县| 开封县| 崇左市| 济南市| 永宁县| 拉萨市| 临沂市| 平昌县| 三门峡市| 安徽省| 峨山| 邓州市| 乌拉特后旗| 龙江县| 三原县| 枣阳市| 陵川县| 临沧市| 大新县| 琼结县| 湘西| 南安市| 泉州市| 贞丰县| 连江县| 会泽县| 陈巴尔虎旗| 永宁县| 肇源县|