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