C C 中相同的浮點數的記憶體布局一定是一樣嗎?

時間 2021-05-31 14:16:35

1樓:Xi Yang

現在浮點數通常都按IEEE 754的規矩來,那麼同乙個數值,記憶體表示應當是相同的,除了最高票提到的NaN。

然而,由於不同機器有不同的位元組序,跨硬體平台的資料可能是不同的,需要檢查、轉換位元組序。

當然,首先你得確認真的是「同乙個數值」。否則就得按照浮點運算擼棒性的那套方法,容許一些誤差,而不是簡單地用==。

2樓:高天

兩個一樣的浮點數在同乙個CPU同乙個作業系統的同乙個編譯器下的記憶體表示是固定的。換句話說,在大部分的應用場合,只要寫在乙個程式裡,兩個一樣浮點數的記憶體表示就是一樣的。但是我猜你要問的不是這個。

我們寫上去的浮點數,和實際記憶體裡儲存的浮點數,很多情況下是不一樣的。我們知道,表達乙個浮點數的記憶體大小是固定的,所以表達一定是不連續的。因此在儲存浮點數的時候,儲存的是乙個比較接近它的可表達的浮點數(為什麼說比較接近而不是最接近?

因為不同的編譯器下,對浮點數的值取捨會不同,所以是最接近的兩個值之一)。換言之,你在寫float a = 1.1的時候,a其實並不是1.

1,而是乙個和1.1非常接近的,用一定位數的內存在一定的表達規則下可以表示的乙個浮點數。擴充套件之,就是不僅兩個完全一樣的浮點數記憶體表達一樣,兩個看似不一樣的浮點數的記憶體表達也可能一樣。

比如float a = 1.1和float a = 1.100000000000001。

當然這個「看似不一樣」是對我們人類而言的,對於電腦來說,這兩個條件下的a是一樣的,而且都不是1.1。

正因為計算機內的浮點數有這種離散的特性,所以在底層系統進行運算的時候,是不會有浮點數存在的,因為浮點數運算有一定的不確定性。所以教科書裡會告訴我們,不要用a == b來比較浮點數。

3樓:Jeson Chen

為什麼知乎客戶端會吞字?

關於記憶體表示問題樓上已經有人說過了。

猜測應該是問浮點數相等的判定問題吧。

這是兩個問題。

如果a=b則二者一定相等,記憶體相同(單指有意義的數值,非NaN這種)。但受限於二進位制表示的精度,浮點數的相同條件很可能無法滿足。比如經由不同運算得到的兩個數學上相同的數很可能由於計算過程中無法精確表示產生的誤差而不同。

所以實際程式中浮點數相等一般是指差值為乙個非常小的數,像(a-b小於0.0001)這種做為ab相等的判定。具體看實際需要。

你看下0.3這種數的二進位制表示就知道了,很多有理數是無法用浮點數精確表示的,是用的其精度所能達到的最好的近似值來表示的。

4樓:Nick

寫了乙個測試程式:(VS2008)

typedef union

floatVsIntType;

floatVsIntType a;

floatVsIntType b;

a.fnum = 1.0;

b.fnum = 1.0;

測試結果:

另外:該實驗只能證明VS2008下直接賦值兩個float的記憶體狀態是一致的。

在教科書強調浮點數的狀態難以捉摸下(float a = float b ?),我也有提主的疑惑。

5樓:

這個問題是計算機體系結構的問題,跟語言沒關係。不同體系結構的機器,其中的資料表示格式不一定相同。比如,Alpha體系上的浮點是VAX格式,不是IEEE754,當然就不一樣了。

至於大端小端就更不提了。

6樓:錠陽

型別決定了乙個數1在記憶體中所佔的位元組數2編譯器如何解釋這些位元組3這個數可以進行哪些操作。

所以兩個不同型別的數,即使在記憶體中的位元完全一致,它們的值也不一樣,可以進行的操作也可能不一樣。比如int和float,它們對應的位元位可能完全一致,但值可以不同。兩個int用/操作符和兩個float 之間用/操作符意義不同。

int可以進行+*-/,結構體不能進行+操作,除非過載運算子。

7樓:leonards

是類似的,只是各組分之間占用的bit數不同,看這裡:https://en.

m.wikipedia.org/wiki/Double-precision_floating-point_format

還有這裡:https://

en.m.wikipedia.org/wiki/Single-precision_floating-point_format

單精度浮點數中的 單 和 浮點 是什麼意思?

XRan 單,雙精度其它答案都解答,不廢話了,我想再說說浮點。數的表示分為浮點表示和定點表示 定點表示 小數點的位置是固定的,不能移動 比如,0.0050618 這個數,它就是這麼大,它的小數點是不能移動的。如果你移動了它的小數點,這個數就變了,就不再是它原來的樣子。浮點表示 小數點的位置是可以移動...

計算機中是如何儲存和處理浮點數的

來知曉 目錄 浮點儲存本質 IEEE標準演算法 例項分析 參考資料 目前計算機中多採用IEEE確定的浮點儲存標準演算法,核心原理為將浮點的整數用2的指數來表達壓縮,小數用2的負指數來表達壓縮。分為指數字 小數字,將整數的表達更壓縮 float 32位固定分配為1bit符號位,8bits指數字,23b...

計算機中的浮點數在數軸上分布均勻嗎?

Milo Yip的解答很直觀。我來對結果做些理論解釋。下圖是IEEE754單精度浮點數在記憶體中的表示法。綠色部分為指數部分,紅色部分為尾數部分。這個表示法的具體解讀可以參考float的精範圍是如何求出來的?坡下碎石的回答。只考慮正數情況時,最高位的符號位為0。2.0f的表示方法如下圖。這時指數部分...