- 編寫高質量代碼:改善C程序代碼的125個建議
- 馬偉 著
- 557字
- 2019-01-01 01:33:12
建議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的運行結果
因此,為了避免出現這種信息丟失的情況,我們在使用整數運算計算一個值并把它賦給浮點變量時,必須將表達式中的一個或全部整數轉換為浮點數。
推薦閱讀
- Mastering Ember.js
- 機器人Python青少年編程開發實例
- Learning AWS Lumberyard Game Development
- INSTANT CakePHP Starter
- Raspberry Pi 2 Server Essentials
- Python機器學習實戰
- Effective Python Penetration Testing
- Learning Vaadin 7(Second Edition)
- Python數據結構與算法(視頻教學版)
- Webpack實戰:入門、進階與調優(第2版)
- Python函數式編程(第2版)
- Hadoop大數據分析技術
- Python第三方庫開發應用實戰
- Socket.IO Cookbook
- Mastering Machine Learning with scikit-learn