欧美经典成人在观看线视频_嫩草成人影院_国产在线精品一区二区中文_国产欧美日韩综合二区三区

當前位置:首頁 > 軟件開發(fā) > 正文

信息技術(shù)float是什么意思 c語言float怎么用

信息技術(shù)float是什么意思 c語言float怎么用

這篇文章給大家聊聊關(guān)于信息技術(shù)float是什么意思,以及c語言float怎么用對應(yīng)的知識點,希望對各位有所幫助,不要忘了收藏本站哦。計算機是如何存儲小數(shù)的在C語言編程中...

這篇文章給大家聊聊關(guān)于信息技術(shù)float是什么意思,以及c語言float怎么用對應(yīng)的知識點,希望對各位有所幫助,不要忘了收藏本站哦。

計算機是如何存儲小數(shù)的在C語言編程中,應(yīng)該注意什么嗎

浮點型在內(nèi)存中的存儲分布方式因機器平臺而異,完全理解所有機器平臺中的浮點型存儲無疑是一件相當麻煩的事。幸運的是,大多機器平臺都遵守IEEE-754標準,很可能讀者和我使用的平臺正是使用的IEEE-754標準。

IEEE-754是如何存儲浮點數(shù)的?

IEEE-754浮點(32位)或雙精度(64位)有三個部分(在IEEE-854下也有類似的96位擴展精度格式):符號位,表示數(shù)字是正的還是負的;指數(shù)位;以及指定實際數(shù)字的尾數(shù)位。以C語言中的單精度浮點數(shù)為例,下面是某位浮點數(shù)的位布局:

該浮點數(shù)的值等于尾數(shù)乘以2^x。讀者應(yīng)該注意,上圖是二進制分數(shù),因此0.1表示1/2。為了方便理解,我們可以將其與十進制的小數(shù)對應(yīng)起來:十進制的0.1等于1*10^-1,所以二進制的0.1等于1*2^-1,也即1/2。

“尾數(shù)+指數(shù)”模式存儲浮點數(shù)可能有一點問題,例如:2x10^-1=0.2x10^0=0.02x10^1,依此類推。同樣一個數(shù)字可能有多種“尾數(shù)+指數(shù)”的表示方法,而同時兼顧多種表示方法勢必會造成巨大的浪費(也可能使在硬件中實現(xiàn)數(shù)學(xué)操作變得困難和緩慢)。

所以,“尾數(shù)+指數(shù)”的存儲模式需要一個統(tǒng)一的標準。事實上,IEEE-754確實已經(jīng)有標準了:假設(shè)給定一個二進制的浮點數(shù),那么除非這個數(shù)是0,否則總有某個位是1。將小數(shù)點移到第一個1之后,調(diào)整指數(shù)位,這樣一來,“尾數(shù)+指數(shù)”的唯一存儲方式就固定下來了,也即“1.mx2^n”形式。

既然小數(shù)點前總是1,那么上述標準下的“尾數(shù)+指數(shù)”的存儲模式甚至都不需要再花費空間存儲小數(shù)點前的1.

但是如果數(shù)字是零呢?IEEEStandardsCommittee通過將零作為一種特殊情況來解決這一問題:如果數(shù)字的每一位都為零,那么數(shù)字就被認為是零。

現(xiàn)在讀者可能又有疑問了,因為1.0=1.0×2^0,上述存儲模式不存儲小數(shù)點前的1,也即尾數(shù)和指數(shù)部分都為0,而“如果數(shù)字的每一位都為零,那么數(shù)字就被認為是零”,這樣看來,1.0似乎是沒有辦法存儲的。

當然可以存儲1.0。單精度浮點數(shù)的指數(shù)部分是“shift-127”編碼的,也即實際的指數(shù)等于eeeeee減去127,所以1.0的表示方法實際上是1.0×2^127。同樣的道理,最小值本應(yīng)該是2^-127,按照“shift-127”編碼指數(shù)部分,也即2^0,可是這樣又變成“指數(shù)部分和尾數(shù)部分都為零”了,因此在該標準下的最小值,實際上的寫法是2^1,也即2^-126。

在我看來,為了表示0和1,舍棄最小值(2^-127)是非常可取的做法。

零不是唯一的“特殊情況”。對于正無窮大和負無窮大,非數(shù)字(NaN),以及沒有數(shù)學(xué)意義的結(jié)果(例如,非實數(shù),或無窮大乘以零之類的計算結(jié)果)也有表示:如果指數(shù)的每一位都等于1,那么這個數(shù)字是無窮大,如果指數(shù)的每一位都等于1,并且尾數(shù)位也都等于1,那么這個數(shù)字就是NaN。符號位仍然區(qū)分+/-inf和+/-nan。

現(xiàn)在,讀者應(yīng)該明白IEEE-754浮點數(shù)的表示方法了,下面是幾個數(shù)字的表示方法:

作為程序員,了解浮點表示的某些特性是很重要的,下標列出了單精度和雙精度IEEE浮點數(shù)的示例值:

注意,本文中的所有數(shù)字都假定為單精度浮點數(shù);上面包含雙精度浮點數(shù)用于參考和比較。

在C語言程序開發(fā)中,數(shù)值的處理是一門值得深究的科學(xué)。本文不可能將復(fù)雜的數(shù)值算法以及相關(guān)的C語言程序開發(fā)經(jīng)驗一一列出。事實上,討論如何以理想的數(shù)值精度進行計算,就和討論如何編寫最快的C語言程序,如何設(shè)計一款優(yōu)秀的軟件一樣,主要取決于程序員本身的綜合素質(zhì)。

鑒于此,這里將嘗試介紹一些基礎(chǔ)的,我認為每個C語言程序員都應(yīng)該知道的內(nèi)容。

相等

首先,我們應(yīng)該明白C語言程序開發(fā)中的兩個浮點數(shù)何時相等。可能讀者并不覺得難,因為似乎C語言中的==運算符就能判斷兩個浮點數(shù)是否完全相等。

然而實際上,C語言中的==運算符是逐位比較兩個操作數(shù)的,而兩個浮點數(shù)的精度總是有限的,在這種場景下,==運算符的實際使用意義就沒有那么大了。

讀者應(yīng)該已經(jīng)明白,計算機存儲浮點數(shù)時,很有可能是需要舍棄一些位的(如果該浮點數(shù)過長),如果CPU或者相應(yīng)的程序沒有按照預(yù)期四舍五入,那么使用==運算符判斷兩個浮點數(shù)是否相等可能會失敗。

例如,標準C語言函數(shù)庫三角函數(shù)cos()的實現(xiàn)其實只是一種多項式近似,也就是說,我們并不能指望cos(π/2)結(jié)果的每一個位都為零。在C語言程序開發(fā)中,我們甚至不能準確的表示π。

看到這里,讀者應(yīng)該思考“相等到底是什么意思呢?”,對于大多數(shù)情況來說,兩個數(shù)“相等”意味著這兩個數(shù)“足夠接近”。本著這種精神,在實際的C語言程序開發(fā)中,程序員通常定義一個很小的值模擬“足夠接近”,并以此判斷兩個浮點數(shù)是否“足夠接近到相等”,例如:

宏flt_equals(a,b)正是通過判斷a和b的距離是否小于EPSILON(10的-7次方),來斷定a和b是否可以被認為“相等”的。這樣的近似模擬技術(shù)有時候是有用的,有時候卻可能導(dǎo)致錯誤結(jié)果,讀者應(yīng)該自行判斷它是否符合自己的程序。

在本例中,EPSILON可以看作是一種用于說明程序精度的標尺。應(yīng)該明白,衡量精度的應(yīng)該是有效數(shù)字,糾結(jié)EPSILON的具體大小并無意義,下面是一個例子。

假設(shè)在某段C語言程序中有兩個數(shù)字1.25e-20和2.25e-20,它倆的差值是1e-20,遠小于EPSILON,但是顯然它倆并不相等。但是如果這兩個數(shù)字是1.2500000e-20和1.2500001e-20,那么就可以認為它們是相等的。也就是說,兩個數(shù)字距離足夠接近時,我們還需要關(guān)注需要匹配多少有效數(shù)字。

溢出

計算機存儲空間總是有限的,因此數(shù)值溢出是C語言程序員最關(guān)心的問題之一。讀者應(yīng)該已經(jīng)知道,如果向C語言中的最大無符號整數(shù)加一,該整數(shù)將歸零,令人崩潰的是,我們并不能只通過看這個數(shù)字的方式獲知是否有溢出發(fā)生,歸零的整數(shù)看起來和標準零一模一樣。

當溢出發(fā)生時,實際上大多數(shù)CPU是會設(shè)置一個標志位的,如果讀者懂得匯編,可以通過檢查該標志位獲知是否有溢出發(fā)生。

float浮點數(shù)溢出時,我們可以方便的使用+/-inf(無窮)。+inf(正無窮)大于任何數(shù)字,-inf(負無窮)小于任何數(shù)字,inf+1等于inf,依此類推。因此在C語言程序開發(fā)中,一個小技巧是,將整數(shù)轉(zhuǎn)換為浮點數(shù),這樣就方便判斷后續(xù)處理是否會造成溢出了。處理完畢后,再將該數(shù)轉(zhuǎn)換回整數(shù)即可。

不過,將整數(shù)轉(zhuǎn)換為浮點數(shù)判斷是否溢出也是要付出代價的,因為浮點數(shù)可能沒有足夠的精度來保存整個整數(shù)。32位的整數(shù)可以表示任何9位十進制數(shù),但是32位的浮點數(shù)最多只能表示7位的十進制數(shù)。所以,如果將一個很大的整數(shù)轉(zhuǎn)換為浮點數(shù),可能不會得到期望的結(jié)果。

此外,在C語言程序開發(fā)中,int與float之間的數(shù)值類型轉(zhuǎn)換,包括float與double之間的數(shù)值類型轉(zhuǎn)換,實際上是會帶來一定的性能開銷的。

讀者應(yīng)該明白,在C語言程序開發(fā)中,不管是否使用整數(shù),都應(yīng)該小心避免數(shù)值溢出的發(fā)生,不僅僅是最開始和最終結(jié)果數(shù)值可能溢出,在一些計算的中間過程,可能會產(chǎn)生一些更大的值。一個經(jīng)典的例子是“C語言數(shù)字配方”計算復(fù)數(shù)的幅度問題,極可能造成數(shù)值溢出的C語言實現(xiàn)是下面這樣的:

假設(shè)該復(fù)數(shù)的實部re和虛部im都等于1e200,那么它們的幅度約為1.414e200,這的確在雙精度的允許范圍內(nèi)。但是,上述C語言代碼的中間過程將產(chǎn)生1e200的平方值,也即1e400,這超出了inf的范圍,此時上面的實現(xiàn)函數(shù)計算的平方根將仍然是無窮大。

因此,magnitude()函數(shù)的更佳C語言實現(xiàn)如下:

應(yīng)該明白,上述C語言代碼為了避免數(shù)值溢出,給出的實現(xiàn)實際上是一種近似。例如im等于1e200,re等于1,那么im/re的平方仍然能夠達到1e400,這會造成數(shù)值溢出。但是平方re/im卻是可以的,因為1e-400會被四舍五入到零,足夠接近得到正確的答案。

有效數(shù)字丟失

上面討論的浮點數(shù)精度,以及相等問題只是C語言程序數(shù)值運算中的冰山一角。“有效數(shù)字丟失”指的是一類情況,在這種情況下,程序員很可能丟失數(shù)值的準確性。

前面我們提到,1.m的尾數(shù)形式確保小數(shù)點前總是1(非零時),既然如此,我們沒有必要再花費一個位的空間用于存儲1。此時,即使尾數(shù)只有最后一位為1,其他位都為0,那么它的有效數(shù)字也是全部的,因為最前方有個“隱藏的1”。但是,如果兩個比較接近的浮點數(shù)相減,這個“隱藏的1”就會被抵消,最終得到的答案可能只剩下一位有效數(shù)字的精度。

幸運的是,就像上面求復(fù)數(shù)幅度避免出現(xiàn)數(shù)值溢出一樣,避免兩個接近的數(shù)字相減出現(xiàn)精度損失的方法也是有的,但是并沒有一個通用的方法。這里給出一個簡單的實例就是使用1/x的函數(shù)代替x的函數(shù),這對于處理二次運算很有效。我的建議是,如果讀者發(fā)現(xiàn)自己的C語言程序給出了令人懷疑的數(shù)值,就應(yīng)該檢查一下相應(yīng)的減法運算了。

看到這里,相信讀者應(yīng)該想到C語言程序中的加法可能也有同樣的問題:假設(shè)有數(shù)字1.0,現(xiàn)在將其與1e-20相加。程序很可能認為1e-20很小,小于EPSILON,于是忽略它,得到答案1.0。這實際上也是一種精度損失。

經(jīng)驗法則

要完全規(guī)避C語言程序中的浮點數(shù)可能帶來的問題,工作量無疑是巨大的。為了簡化問題,我們通常認為浮點數(shù)帶來的精度問題是這樣的:對浮點數(shù)的操作越多,損失的精度也會越多。

正如前文舉的例子cos(π/2),C語言它的實現(xiàn)實際上是一種近似,得到的答案并不是0,而是6.12303E-17。不過就這個答案本身而言,它已經(jīng)足夠小,認為等于0也沒什么大問題。但是如果我們下一步計算是除以1e-17,那么得到的答案就約是6了,這與預(yù)期的零相差甚遠。

不要忘記整數(shù)

最后,在C語言程序開發(fā)中,并不是只有浮點數(shù)才重要的,整數(shù)同樣重要,它的精確性是一個有用的工具。有時程序需要跟蹤變化的分數(shù)(例如比例因子)。在這種情況下,既然浮點數(shù)受各種因素影響,那么我們完全可以將該分數(shù)存儲為整數(shù)分子和分母來避免問題。在需要使用浮點數(shù)時,隨時再做一次除法運算就可以了。

c語言用什么編碼存放數(shù)據(jù)的

皖西學(xué)院計算機科學(xué)與技術(shù)系,摘要:C語言數(shù)據(jù)類型豐富,,究。在TurboC2.0中,float型,編碼長度分別為4B、8B和10B,從左至右,第一位,,、11b和15b,剩余部分為尾數(shù)的編碼。存儲時以字節(jié)為單位將編碼逆序存放。,在實驗的基礎(chǔ)上歸納出了實型數(shù)據(jù)的相關(guān)屬性。

diveiknai什么跑鞋好

亞瑟士、美津濃,銳步。

1、diveiknai(迪維酷納)是一家專門經(jīng)營各類運動鞋的電商平臺,其中,銷量大、性價比排名前三的跑鞋是亞瑟士、美津濃,銳步。

2、具體介紹如下:

①亞瑟士,綜合評分90,售價280元。

亞瑟士不僅高端產(chǎn)品做得好,面向大眾群體的平民線也做得相當完善,無論日常慢跑鞋和越野跑鞋,都有對應(yīng)的入門級系列。

②美津濃,綜合評分870,售價300元。

美津濃跑鞋分為減震型、支撐型、競速型和越野型,從入門級到頂級都有對應(yīng)款式可選,相當豐富。入門級產(chǎn)品線不是很多,主要有Maxmizer系列和Spark系列。

③銳步,綜合評分84,售價129元。

銳步與化工企業(yè)巨頭巴斯夫合作,共同研發(fā)得出核心技術(shù)Floatride,基材為PEBAX,是一種比EVA或TPU為基材發(fā)泡的材料更輕、更彈的材料,同時緩震效果極佳,整體性能相當突出,應(yīng)用在高端跑鞋上。

usbfloat充電是快充嗎

不是快充,電腦usb輸出電壓最大直流5V,輸出電流不大于500毫安,你的手機充電器輸出電流一定高于500毫安,一般都是1A的,有些手機是2A的。用usb給手機充電速度比充電器慢。

浮籌比率是什么

在股票軟件中表示冷熱的指標叫CYF,嚴謹?shù)拿Q叫浮籌率。就是這些籌碼分為長線持有者,鎖定了不賣的,還有被短線交易來交易去,被短線總在交易的就叫浮籌,浮籌所占的比率叫浮籌率,又叫CYF,這個F就是float,浮籌的意思,這個是做技術(shù)分析系統(tǒng)中表示冷熱的一些基本工具。

關(guān)于信息技術(shù)float是什么意思和c語言float怎么用的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。