寧夏網(wǎng)站設(shè)計聯(lián)系電話推廣公司屬于什么公司
浮點數(shù)相比定點數(shù)或者整數(shù),為了處理小數(shù)點引入了指數(shù),導致小數(shù)點的位置根據(jù)不同浮點數(shù)而不同,故名為Floating Point Number. 一般而言,IEEE754標準被大部分編程語言的浮點數(shù)使用,它節(jié)省了浮點數(shù)的保存空間。如不然,浮點數(shù)可能按每一位ASCII碼保存,包括整數(shù)部分、小數(shù)點和小數(shù)部分,占用空間不可控制。
小數(shù)點位置浮動的原因
浮點數(shù)整數(shù)部分長度不一,為了統(tǒng)一整數(shù)部分和指數(shù)部分,把所有整數(shù)都轉(zhuǎn)換成0.xx格式,造成小數(shù)點位置不一。
浮點數(shù)和整數(shù)
- 浮點數(shù)的位級存儲和整數(shù)完全不同,整數(shù)1和浮點數(shù)1.0存儲也截然不同。通過調(diào)試器查看int變量和float變量的內(nèi)存存儲,或者寫一段dump字節(jié)代碼比較其區(qū)別,還有一種方式,C/C++ %a格式串可用十六進制形式表達浮點數(shù)(其他編程語言可能不適用)。
- 不同浮點數(shù)位級存儲也不相同,float和double是不同的。
- 浮點數(shù)和整數(shù)運算,整數(shù)會默認先轉(zhuǎn)換成浮點數(shù)。
f = f + i;
cvtsi2ss xmm0,dword ptr [i]
addss xmm0,dword ptr [f]
movss dword ptr [f],xmm0
浮點數(shù)指令
早期計算機根本沒有浮點數(shù)處理ALU,浮點數(shù)靠軟件整數(shù)去模擬,性能極低。后來,加入了浮點數(shù)FPU,浮點數(shù)處理速度極大提升,比如xmm寄存器。
- double f = 2.25; // IEEE 754內(nèi)存存儲
- 00501056 movsd xmm0,mmword ptr [__real@4002000000000000 (0502108h)]
精確性
浮點數(shù)的表達方式利用整數(shù)位和小數(shù)位計算的2n數(shù)值(n可正可負)計算,必然出現(xiàn)不準確。1.5可精確表示,0.3卻無法精確表示。有的書籍上提到,浮點數(shù)不要用==或!=判斷,其實是考慮有不精確表達的可能。在商業(yè)銀行金融領(lǐng)域,這是不能容忍的。
- COBOL編程語言是上古時期可以處理小數(shù)精確度很好的一門語言,因為它真的用模擬的形式保存小數(shù)點和小數(shù)位,而非IEEE 754這種壓縮版。
- C#引入了decimal類型處理小數(shù)點更精確。如下兩種不同類型變量輸出的結(jié)果第一個會更精確。
decimal d = 3.14159265124m;
float f = 3.14159265123f;
浮點數(shù)的類型
盡管4字節(jié)的浮點數(shù)可表達相當大的數(shù)值,但對于人類而言,總不夠用。一般而言,浮點數(shù)有3種類型,單精度的float和雙精度的double以及更長的long double, 可參考:數(shù)據(jù)類型大小
- C語言為了區(qū)分float和double, 輸入時用%f代表float, %lf代表double, 但對于輸出%f和%lf作用相同。
- C語言中float類型是默認轉(zhuǎn)換成double去處理,如下圖所示。
- C99引入了long double (%Lf), 注意并不意味long double一定比double要長,根據(jù)編譯器選擇。
微風不燥,陽光正好,你就像風一樣經(jīng)過這里,愿你停留的片刻溫暖舒心。
我是程序員小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等編程技術(shù)的技巧經(jīng)驗分享),若作品對您有幫助,請關(guān)注、分享、點贊、收藏、在看、喜歡,您的支持是我們?yōu)槟峁椭淖畲髣恿Α?/p>
歡迎關(guān)注。助您在編程路上越走越好!