float 型別的儲存

2021-09-29 13:09:42 字數 2008 閱讀 5755

首先,看一段**:

int main()

if (d != f)

}

這個程式的輸出結果是:hello world!然後你有沒有產生了好奇???這是為啥,下面我就來具體講一講float在記憶體中的儲存方式!!!

目前所有的計算機都支援乙個被稱為ieee浮點的標準.題外話:電器氣和電子工程師協會(ieee

)是乙個包括所有電子和計算機技術的專業團體.它出版刊物,舉辦會議,並且建立委員會來定義標準,內容涉及從電力傳輸到軟體工程.另乙個ieee標準的例子是無線網路的802.11標準.

ieee浮點標準用v=(

−1)s

×2e×

mv = (-1)^s \times 2^e\times m

v=(−1)

s×2e

×m的形式來表示乙個數:

在單精度浮點格式(c語言中的float)中,s,exp和frac欄位分別為1位,k=8位和n=23位,得到乙個32位的表示。

說了這麼多,你可能還是看得雲裡霧裡,沒關係!!!接下來,我們還是通過**來看一看:

int main()

輸出結果: 3f800000

v =(

−1)s

×2e×

mv = (-1)^s \times 2^e\times m

v=(−1)

s×2e

×m

說了這麼多,v=(

−1)s

×2e−

127×1.f

v = (-1)^s \times 2^\times 1.f

v=(−1)

s×2e

−127

×1.f

, 現在這個公式能看懂了嗎???

能看懂的話這部分基本就掌握了,如果還看不懂,就在自己的電腦上多輸出一些float的值,在畫一畫,就會明白了。

留乙個問題,float型別真的不能精確表示所有值,比如0.50(1

2\frac 12

21​)

是不是覺得關於浮點數的問題都解決了,emmmm……

別急,又一朵烏雲有輪罩即將來襲,哈哈哈哈,你覺得下面這個程式的輸出結果將會是什麼???

int main()

你覺得會是什麼呢???哈哈哈哈,隨機值

之所以會出現隨機值,是因為計算機是有專門的浮點數暫存器的,但是printf中的引數%d計算機會預設的從一些通用暫存器中拿值,而不會從浮點暫存器中拿,所以會導致隨機值現象的出現。

基本說完了float型別的儲存,但是也並沒有介紹關於對於不能精確表示的浮點的捨入,主要這部分我也不是很了解,之後如果了解了,再來補充吧。

下圖是double雙精度型別的記憶體儲存示意圖

下面回到這篇文章一開始的那個程式吧,能理解了嗎

假如我將double 的= 0.5,你覺得程式的輸出結果又是什麼???

輸出結果是hello

最後留乙個問題,你覺得在浮點數0能精確表示嗎???

今天看到乙個小夥伴寫的float儲存的文章,恍然大悟,我寫的這篇文章更傾向於從概念方面解釋,但小夥伴的文章確實從為什麼方面解釋了,寫的很好,大家可以看看。

float型別的資料儲存方式

回顧預設轉換 byte 1b char 2b short 2b int 4b long 8b float 4b double 8b 問題 為什麼預設轉換時float型在long型後面?原因 1.他們的底層儲存結構不同 2.float型別的表示範圍比long型大 long 2 63 1 float 3...

float型別在記憶體中的儲存

首先還是看一道題目 include stdafx.h include include using namespace std int tmain int argc,tchar argv 125.5在記憶體中的表示為 125.5轉化為二進位制 1111101.1,變為整數字為1,位1.1111011 ...

python 儲存float型別的小數的位數方法

python保留兩位小數 in 1 a 5.026 in 2 b 5.000 in 3 round a,2 out 3 5.03 in 4 round b,2 out 4 5.0 in 5 2f a out 5 5.03 in 6 2f b out 6 5.00 in 7 float 2f a ou...