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

建議3-6:盡量將浮點運算中的整數轉換為浮點數

在討論這個話題之前,我們先看一個示例程序,如代碼清單1-22所示。

代碼清單1-22 浮點數運算示例


#include <stdio.h>
int main(void)
{
    int i1=321;
    float f1=(float)(i1/9);
    float f2=i1/9.0f;
    float f3=(float)i1/9;
    float f4=(float)i1/9.0f;
    printf("(float)(i1/9)=%f\ni1/9.0f=%f\n(float)i1/9=%f\n
            (float)i1/9.0f=%f\n",f1,f2,f3,f4);
}

在代碼清單1-22中,我們定義了一個int類型的變量i1,并將i1除以9的值分別賦給了float類型的變量f1、f2、f3與f4。從表面上來看,最后f1、f2、f3與f4的結果應該完全相同。

但實際情況并非如此,當程序執行語句“float f1=(float)(i1/9)”時,它會先執行表達式“i1/9”,然后將表達式“i1/9”的執行結果35轉換成浮點類型再賦給f1,這樣就嚴重地導致數據丟失。執行“float f1=(float)(i1/9)”語句在VC++2010中產生的匯編代碼如下所示:


004113A5  mov         eax,dword ptr [i1]
004113A8  cdq
004113A9  mov         ecx,9
004113AE  idiv        eax,ecx
004113B0  mov         dword ptr [ebp-100h],eax
004113B6  fild        dword ptr [ebp-100h]
004113BC  fstp        dword ptr [f1]

但當我們將計算表達中的一個整數轉換為浮點類型時,如執行語句“float f2=i1/9.0f”時,它將先執行數據轉換操作,即先將變量i1轉換為浮點類型,然后再執行除法計算。執行“float f2=i1/9.0f”語句在VC++2010中產生的匯編代碼如下所示:


004113BF  fild      dword ptr [i1]
004113C2  fdiv      qword ptr [__real@4022000000000000 (415788h)]
004113C8  fstp      dword ptr [f2]

代碼清單1-22的運行結果如圖1-36所示。

圖1-36 代碼清單1-22的運行結果

因此,為了避免出現這種信息丟失的情況,我們在使用整數運算計算一個值并把它賦給浮點變量時,必須將表達式中的一個或全部整數轉換為浮點數。

主站蜘蛛池模板: 河曲县| 正蓝旗| 威远县| 固原市| 茂名市| 武冈市| 镇沅| 浦城县| 临洮县| 庆安县| 凭祥市| 静乐县| 闸北区| 大新县| 恩平市| 南投县| 蓬莱市| 炎陵县| 天峨县| 沙雅县| 武隆县| 荆门市| 道孚县| 西贡区| 博野县| 沁源县| 黄大仙区| 乌兰县| 柞水县| 布拖县| 琼中| 岑溪市| 高邮市| 尤溪县| 汽车| 南华县| 巴林右旗| 双流县| 五常市| 乐至县| 通榆县|