国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

深析C語言浮點(diǎn)型數(shù)據(jù)的輸入輸出

2019-09-09 01:12方星星呂永強(qiáng)
中國教育技術(shù)裝備 2019年4期
關(guān)鍵詞:輸入輸出C語言

方星星 呂永強(qiáng)

摘? 要 C語言的基本數(shù)據(jù)類型分為:整型、字符型和浮點(diǎn)型,大多C語言教材都概括了整型和字符型數(shù)據(jù)的編碼及輸入輸出,但并未詳細(xì)介紹浮點(diǎn)型數(shù)據(jù)的編碼及輸入輸出,這導(dǎo)致很多學(xué)生不能靈活運(yùn)用這一知識點(diǎn)。本文為了彌補(bǔ)教材的不足和便于學(xué)生更好掌握浮點(diǎn)數(shù)的輸入輸出,首先分析了float和double數(shù)據(jù)的編碼,再歸納出浮點(diǎn)型數(shù)據(jù)按十進(jìn)制、二進(jìn)制和十六進(jìn)制輸出的三種方法,最后結(jié)合內(nèi)存結(jié)構(gòu)和具體事例對float數(shù)據(jù)double數(shù)據(jù)的輸入作了深入分析,并闡述了double數(shù)據(jù)%f和%lf輸入的區(qū)別。

關(guān)鍵詞 輸入輸出;%f和%lf;浮點(diǎn)型數(shù)據(jù);C語言

中圖分類號:G642? ? 文獻(xiàn)標(biāo)識碼:B

文章編號:1671-489X(2019)04-0044-03

Abstract The basic data types of C language are divided into integer, character type and floating-point. Most of the C language textbooks summarize the encoding and the input and output of integer and character data, but do not introduce the encoding and the input and output of floating-point data in detail, which leads to the fact that many students cannot use this knowledge flexibly. In order to make up for the deficiency of the textbook and make it easier for students to better master the input and output of floating point numbers, this

paper first analyzes the encoding of float and double data, then summarizes three methods of floating-point data output by decimal, binary and hexadecimal system, and finally makes an in-depth analy-

sis of the input of double data of float data combined with memory structure and specific cases, and explains the difference between the input of double data by %f and by %lf.

Key words input and output; by %f and by %lf; floating-point data; C language

1 前言

浮點(diǎn)數(shù)即實(shí)數(shù),分為單精度(float或single)、雙精度(double)和長雙精度(long double)三類。精度越高,則該類型表示的數(shù)據(jù)取值范圍越大,占內(nèi)存字節(jié)數(shù)越多。在C語言中,一般只涉及float類型和double類型數(shù)據(jù),教材對于兩者的輸入輸出都有所介紹,但對于浮點(diǎn)數(shù)的編碼原理、十進(jìn)制以外的輸出形式、數(shù)據(jù)輸入的原理等方面的內(nèi)容提及較少。除此以外,不少教材在描述浮點(diǎn)型數(shù)據(jù)輸入輸出時(shí),雖然指出double型數(shù)據(jù)的輸入只能用%f,輸出可以用%f,也可以用%lf,但并未指明原因。以上諸多因素致使學(xué)生在學(xué)習(xí)時(shí)有很多困惑。為答疑釋惑,本文從浮點(diǎn)數(shù)編碼、浮點(diǎn)數(shù)的三種輸出形式、float數(shù)據(jù)輸入和double數(shù)據(jù)輸入等四個(gè)方面來闡述浮點(diǎn)數(shù)的輸入輸出。

2 float和double數(shù)據(jù)的編碼

浮點(diǎn)數(shù)的二進(jìn)制編碼不同于整型數(shù)和字符型數(shù)。1985年,為了統(tǒng)一浮點(diǎn)數(shù)的存儲格式,IEEE制定了IEEE 754標(biāo)準(zhǔn)。目前,絕大多數(shù)計(jì)算機(jī)都遵守這一標(biāo)準(zhǔn),極大地改善了各種軟件的可移植性。ANSI C采用該標(biāo)準(zhǔn)對float和double進(jìn)行編碼。

float數(shù)據(jù)的編碼? 根據(jù)IEEE 754的規(guī)定,浮點(diǎn)數(shù)在編碼時(shí)首先要進(jìn)行規(guī)格化,即用如下形式表示:

規(guī)格化數(shù)=符號位·尾數(shù)×2n其中,符號位為0或1,分別表示正數(shù)或負(fù)數(shù);尾數(shù)是形式為1.XXX…XXX的二進(jìn)制數(shù),小數(shù)點(diǎn)之前為1(但0屬于特殊情況,需要特殊處理);n為指數(shù),二進(jìn)制形式(習(xí)慣上寫成十進(jìn)制)。

float數(shù)據(jù)存儲時(shí)占四個(gè)字節(jié)(32位),IEEE 754規(guī)定各位的意義及格式如圖1所示。

在存儲時(shí),尾數(shù)中的“1.”不存儲,目的是節(jié)省存儲空間。另外,階碼等于規(guī)格化中的指數(shù)加上127,即階碼=指數(shù)+127。因?yàn)橹笖?shù)可以是負(fù)數(shù),取值范圍是-126~127(-127預(yù)留為特殊使用),為了便于處理負(fù)指數(shù)的情況,IEEE 754標(biāo)準(zhǔn)要求指數(shù)加上127后存儲。如float數(shù)據(jù)1.23經(jīng)過規(guī)格化后為1.0011101 01110000 10100100×20(尾數(shù)考慮二進(jìn)制進(jìn)位),存儲時(shí)的指數(shù)為0+127=127=01111111,因此,float數(shù)據(jù)1.23的最終的存儲格式如圖2所示。

double數(shù)據(jù)的編碼? 雙精度浮點(diǎn)數(shù)的規(guī)格化過程同float數(shù),但在存儲格式上,雙精度浮點(diǎn)數(shù)占八個(gè)字節(jié)(64位),IEEE 754規(guī)定各位的意義及格式如圖3所示。其中符號位、階碼和尾數(shù)分別占1、11和52位。另外,階碼=規(guī)格化中的指數(shù)+1023。

如double數(shù)據(jù)1.23經(jīng)過規(guī)格化后為1.00111010111000010100 01111010 11100001 01000111 10101110×20(尾數(shù)考慮進(jìn)位),存儲時(shí)的指數(shù)為0+1023=1023=01111111111,因此,double數(shù)據(jù)1.23的最終存儲格式如圖4所示。

與單精度相比,雙精度浮點(diǎn)數(shù)的階碼和尾數(shù)的位數(shù)更長,因此,雙精度所能表示的數(shù)值范圍更大且精度更高,可提供更多的有效數(shù)字位數(shù),float變量只能接收十進(jìn)制有效位數(shù)為7位,而double變量能接收16位有效數(shù)字。

3 浮點(diǎn)數(shù)的輸出

浮點(diǎn)數(shù)有十進(jìn)制、二進(jìn)制和十六進(jìn)制三種輸出形式,但是大多數(shù)的教材只介紹了十進(jìn)制形式的輸出。需要說明的是,十進(jìn)制形式分為小數(shù)形式和指數(shù)形式,本文只介紹小數(shù)形式輸出。另外,為便于深入分析用%f和%lf輸入浮點(diǎn)數(shù)時(shí)的真實(shí)值,在此延伸介紹浮點(diǎn)數(shù)的二進(jìn)制和十六進(jìn)制輸出。

十進(jìn)制輸出(小數(shù)形式)? 格式說明:%f是將浮點(diǎn)數(shù)以小數(shù)形式輸出。float型數(shù)據(jù)用%f輸出,doule型數(shù)據(jù)一般用%lf輸出。由于printf是一個(gè)可變長度列表的函數(shù),當(dāng)調(diào)用printf函數(shù)時(shí),float會自動轉(zhuǎn)換成double類型,其結(jié)果是printf函數(shù)無法區(qū)分float類型和double類型參數(shù)。因此,printf函數(shù)中的%f既可以用于float數(shù)據(jù)輸出,也可以用于double數(shù)據(jù)輸出。如果變量類型為float,則只輸出四個(gè)字節(jié)對應(yīng)的浮點(diǎn)數(shù);如果變量類型為double,會輸出八個(gè)字節(jié)對應(yīng)的浮點(diǎn)數(shù)。需要說明的是,double變量最多能接收16位有效數(shù)字,%f默認(rèn)只輸出小數(shù)點(diǎn)后6位,如果要輸出更多有效位數(shù),要加修飾符.n,即%.nf(.n表示輸出小數(shù)的位數(shù))。如%.16f用于輸出小數(shù)點(diǎn)后16位。

十六進(jìn)制輸出? 格式說明:%x一般用于整型數(shù)據(jù)的十六進(jìn)制輸出,如果用于浮點(diǎn)數(shù),則是將浮點(diǎn)數(shù)的二進(jìn)制編碼以十六進(jìn)制輸出。float數(shù)的十六進(jìn)制輸出用%x,double數(shù)的十六進(jìn)制輸出用%llx。如float數(shù)1.23和double數(shù)1.23按十六進(jìn)制輸出的結(jié)果分別為3f9d70a4和3ff3ae147ae147ae(讀者可自行驗(yàn)證)。

二進(jìn)制輸出? 二進(jìn)制輸出沒有對應(yīng)的格式說明,需要編寫程序?qū)⒆兞康拿總€(gè)字節(jié)按二進(jìn)制位進(jìn)行輸出。設(shè)計(jì)程序時(shí),引入一個(gè)共用體,包含字符數(shù)組和浮點(diǎn)型變量兩個(gè)成員,它們共用四個(gè)字節(jié)或八個(gè)字節(jié)的存儲空間,定義形式如下:

union bianma{char ch[4];float a;}? ? //處理double時(shí)成員定義為char ch[8];和double a;將字符數(shù)組元素按從后到前的順序進(jìn)行排列,每個(gè)元素都以二進(jìn)制輸出,最終的輸出結(jié)果即為該浮點(diǎn)數(shù)的二進(jìn)制輸出。字符數(shù)據(jù)以二進(jìn)制形式輸出,需要進(jìn)行二進(jìn)制位的移位運(yùn)算,對應(yīng)的程序代碼如下:

4 float數(shù)據(jù)的輸入

文中的浮點(diǎn)型數(shù)據(jù)輸入僅指十進(jìn)制小數(shù)形式的輸入。float數(shù)據(jù)的輸入用%f,說明輸入的是十進(jìn)制小數(shù)。格式說明:%f指明輸入的數(shù)據(jù)按float型處理,系統(tǒng)將此數(shù)據(jù)按float類型編碼后存入變量占用的四個(gè)存儲單元中。存儲時(shí),低地址存儲單元存放數(shù)據(jù)的低字節(jié),高地址存儲單元用于存放數(shù)據(jù)的高字節(jié)。如執(zhí)行語句段float a;scanf(“%f”,&a);時(shí),鍵盤輸入1.23,則變量a占用的四個(gè)內(nèi)存單元值如圖7所示(假設(shè)變量a的地址為2000H)。

5 double數(shù)據(jù)的輸入

正確實(shí)現(xiàn)double數(shù)據(jù)的輸入(只考慮十進(jìn)制小數(shù)形式)只能用%lf,如果改用%f,則輸入不當(dāng)。

用%lf輸入double數(shù)? 此用法能實(shí)現(xiàn)正確輸入,過程同float數(shù)據(jù)的輸入。格式說明:%lf指明輸入的數(shù)據(jù)按double處理,系統(tǒng)先將此數(shù)據(jù)按double類型編碼,再存入變量占用的八個(gè)存儲單元中。如執(zhí)行語句段double b;scanf(“%f”,&b);時(shí),輸入1.23,則變量b占用的八個(gè)內(nèi)存單元值如圖8所示(假設(shè)變量b的地址為2000H)。

用%f輸入double數(shù)? 該用法不能正確輸入double數(shù)。如執(zhí)行語句double e;scanf(“%f”,&e);時(shí),輸入1.23,變量e的值為0。這是由于%f指明輸入的數(shù)據(jù)只按float類型處理,數(shù)據(jù)按float類型編碼后只存放到e占用的前四個(gè)存儲單元中,即低地址存儲單元。而變量e實(shí)際占用八個(gè)存儲單元,系統(tǒng)自動將0存儲到四個(gè)高地址存儲單元,因此,變量e占用的八個(gè)內(nèi)存單元真實(shí)值如圖9所示(假設(shè)變量e的地址為2000H)。不難得出,這八個(gè)字節(jié)對應(yīng)的double數(shù)十進(jìn)制值為0(有效位數(shù)為15位),因此,執(zhí)行語句printf(“%lf”,e);后,得出e的值為0。

6 結(jié)語

為便于掌握%f和%lf的用法,本文在分析float和double數(shù)據(jù)的編碼原理基礎(chǔ)上,提出浮點(diǎn)數(shù)的三種輸出方法,再分別介紹float和double數(shù)據(jù)的輸入,最后總結(jié)double數(shù)據(jù)用%f和%lf進(jìn)行數(shù)據(jù)輸入的區(qū)別。由于浮點(diǎn)數(shù)的編碼較為復(fù)雜,C語言又嚴(yán)格規(guī)定了%f和%lf的用途,因此,浮點(diǎn)數(shù)的輸入輸出不同于整型和字符型,不便于掌握。在實(shí)際應(yīng)用中,為避免數(shù)據(jù)輸入輸出結(jié)果不一致,建議float數(shù)據(jù)輸入輸出統(tǒng)一用%f,double數(shù)據(jù)輸入輸出統(tǒng)一用%lf。

參考文獻(xiàn)

[1]譚浩強(qiáng).C程序設(shè)計(jì)[M].4版.北京:清華大學(xué)出版社,2010.

[2]張亞玲.大學(xué)計(jì)算機(jī)基礎(chǔ):計(jì)算思維初步[M].北京:清華大學(xué)出版社,2014.

[3]朱亞超.基于IEEE 754的浮點(diǎn)數(shù)存儲格式分析研究[J].計(jì)算機(jī)與信息技術(shù),2006(9):50-52.

[4]田祎,樊景博.C語言中浮點(diǎn)數(shù)的表示范圍淺析[J].軟件工程,2016(4):8-10.

[5]IEEE Standard for Binary Floating-Point Arithme-tic.ANSI/IEEE Standard 754-1985[M]//Institute of Electrical and Electronics Engineers.1985.

猜你喜歡
輸入輸出C語言
“輸入輸出”教學(xué)理念對中醫(yī)研究生經(jīng)典課程的啟示
基于Visual Studio Code的C語言程序設(shè)計(jì)實(shí)踐教學(xué)探索
Camtasia Studio高清視頻輸入輸出原理及方法
鐵路信號系統(tǒng)安全輸入輸出平臺
基于C語言的計(jì)算機(jī)軟件編程
輸入輸出理論在高中英語教學(xué)中的應(yīng)用
輸入輸出視角下高職英語教學(xué)研究
高職高專院校C語言程序設(shè)計(jì)教學(xué)改革探索
“輸入輸出”指導(dǎo)下的民辦高校校園英語文化建設(shè)研究
論子函數(shù)在C語言數(shù)據(jù)格式輸出中的應(yīng)用