《编写高质量代码:改善c程序代码的125个建议》——建议4-2:浮点数转换为新类型时必须做范围检查...
本節(jié)書摘來自華章計算機(jī)《編寫高質(zhì)量代碼:改善c程序代碼的125個建議》一書中的第1章,建議4-2,作者:馬 偉 更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“華章計算機(jī)”公眾號查看。
建議4-2:浮點(diǎn)數(shù)轉(zhuǎn)換為新類型時必須做范圍檢查
關(guān)于浮點(diǎn)類型數(shù)據(jù)的轉(zhuǎn)換原則,在C99的6.3.1.4節(jié)與6.3.1.5節(jié)中做了非常重要的闡述,其表達(dá)的主要意思如下:
當(dāng)我們將一個浮點(diǎn)類型的數(shù)據(jù)轉(zhuǎn)換成除_Bool類型之外的一個整型數(shù)據(jù)時,該浮點(diǎn)數(shù)的小數(shù)部分須被丟棄,只保留它的整數(shù)部分。如果浮點(diǎn)數(shù)整數(shù)部分的值無法使用這種整型表示方法時,其行為是未定義的。
與此同時,如果我們將一個整數(shù)類型的數(shù)據(jù)轉(zhuǎn)換成一個浮點(diǎn)類型時,如果該整型數(shù)據(jù)的值在該浮點(diǎn)數(shù)的取值范圍內(nèi),并且能夠被浮點(diǎn)類型精確表示,那么將會被正確轉(zhuǎn)換;如果該整型數(shù)據(jù)的值在該浮點(diǎn)數(shù)的取值范圍內(nèi),但不能夠被浮點(diǎn)類型精確表示,那么轉(zhuǎn)換的結(jié)果是最鄰近的稍大或者稍小的可表示值;但如果該整型數(shù)據(jù)的值在該浮點(diǎn)數(shù)的取值范圍外,其行為是未定義的。
當(dāng)我們將一個double 類型降級轉(zhuǎn)換為float類型、將long double類型降級轉(zhuǎn)換到double或者float類型時,如果轉(zhuǎn)換的值在新類型的取值范圍內(nèi),并且能夠被新類型精確表示,那么將會被正確轉(zhuǎn)換;如果轉(zhuǎn)換的值在新類型的取值范圍內(nèi),但不能夠被新類型精確表示,那么轉(zhuǎn)換的結(jié)果是最鄰近的稍大或者稍小的可表示值;但如果轉(zhuǎn)換的值在新類型的取值范圍外,其行為是未定義的。
由此可見,為了避免浮點(diǎn)數(shù)據(jù)轉(zhuǎn)換時導(dǎo)致的未定義行為,我們應(yīng)該在轉(zhuǎn)換時對數(shù)據(jù)進(jìn)行相關(guān)的范圍檢查。例如,下面的代碼清單1-23演示了如何將double類型轉(zhuǎn)換為int類型。
在上面的程序中,我們通過語句“if(d1>(double)INT_MAX||d1<(double)INT_MIN)”來對程序做類型轉(zhuǎn)換時的取值范圍檢查,這樣就可以避免在執(zhí)行語句“i1=(int)d1”時發(fā)生未定義行為。
但需要特別強(qiáng)調(diào)的是,上面的程序是建立在double類型的取值范圍大于int類型的取值范圍的基礎(chǔ)之上的。因此,在使用這種方法做取值范圍檢查時,你必須完全明白不同編譯器所對應(yīng)的相關(guān)類型的取值范圍。假設(shè)在某個編譯器中,double類型的取值范圍小于int類型的取值范圍,那么上面這種方法將是不可行的,實(shí)際上這種情況基本沒有。
相對于浮點(diǎn)數(shù)與整數(shù)之間的轉(zhuǎn)換,浮點(diǎn)數(shù)與浮點(diǎn)數(shù)之間的轉(zhuǎn)換就簡單多了。演示示例如代碼清單1-24所示。
總結(jié)
以上是生活随笔為你收集整理的《编写高质量代码:改善c程序代码的125个建议》——建议4-2:浮点数转换为新类型时必须做范围检查...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 蓝桥杯算法提高 出现次数最多的
- 下一篇: find命令总结