首先,看一段**:
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...