国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

正確認識浮點數

warkiz / 1481人閱讀

摘要:浮點數在計算機中是根據二進制浮點數算數標準儲存的。尤其在我們日常工作中,不要比較浮點數的大小,如果需要精確的比較計算,請使用系列函數。還有一點,浮點數不準確和沒有任何關系,不背這個鍋。

大家在日常開發中,必然使用過浮點數,也會發現浮點數不是精確的,那究竟是什么原因造成的呢?

奇怪的結果
var_dump((1-0.9) == 0.1);
//輸出:bool(false)

很奇怪吧!1-0.9怎么能不等于0.1呢?這是為什么呢?這要從浮點數的儲存標準開始說。

IEEE 754

浮點數在計算機中是根據IEEE 754(二進制浮點數算數標準)儲存的。
計算公式為: (-1)^S x M x 2^E

32位單精度儲存結構(對應占位)

符號(S) 階碼(E) 尾數(M)
1 8 23

64位雙精度儲存結構(對應占位)

符號(S) 階碼(E) 尾數(M)
1 11 52

解釋:

S: 符號(0正,1負)

E: 階碼(指數)

M: 尾數(二進制小數,數字的實體部分)

M(尾數)和E(階碼)不同情況需要分別對待

E(階碼)的三種狀態及對應的M表示

從圖中(截圖于深入理解計算機系統)我們可以分為三種情況(第三種又分為兩種特殊情況)

規格化

E既不等于0也不等于255(將S按十進制計算),這個時候的E=E-127,M的二進制小數默認省略了1.,也就是M=1.M(二進制小數)
我們做一個簡單的測試看一下二進制00111110001000000000000000000000(32位)表示的對應的浮點數為多少?

首先拆分二進制: 0 01111100 01000000000000000000000

E = 124 = 124 - 127 = -3

M = 1.01000000000000000000000

套公式: 1 x 1.01000000000000000000000 x 2^-3 = 0.00101000000000000000000000 = 2^-3 + 2^-5 = 0.15625

使用PHP驗證一下結果:

var_dump(unpack("f", pack("l", bindec("00111110001000000000000000000000")))[1]);
//輸出: float(0.15625)

上面的例子沒有丟失精度,下面看一個丟失精度的例子:

printf("%032s", decbin(unpack("l", pack("f", 1/3))[1]));
//輸出: 00111110101010101010101010101011

var_dump(unpack("f", pack("l", bindec("00111110101010101010101010101011")))[1]);
float(0.33333334326744)

丟失精度最主要原因就在于M(二進制小數),我們只能精確的表示2^n倍數的數(2^-1(0.5),2^-2(0.25),2^-3(0.125)...),丟了在所難免。

非規格化

E等于0,這個時候E=-126,M的二進制小數前綴為0.,也就是M=0.M(二進制小數),具體過程就不寫了,和上面類似

特殊情況

E等于255(全部位都為1),如果M全部為0,那么表示為無窮大,否則表示為NaN(不是一個數)

var_dump(unpack("f", pack("l", bindec("01111111100000000000000000000000")))[1]);
//輸出: float(INF)

var_dump(unpack("f", pack("l", bindec("01111111100000000000000000000110")))[1]);
//輸出: float(NAN)
不要比較浮點數

總之,浮點數是不準確的。尤其在我們日常工作中,不要比較浮點數的大小,如果需要精確的比較計算,請使用bc*系列函數。
還有一點,浮點數不準確和PHP沒有任何關系,PHP不背這個鍋。

歡迎關注二維碼,一起交流學習

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22369.html

相關文章

  • JS正則表達式驗證

    摘要:驗證是否含有等字符驗證漢字驗證地址驗證驗證電話號碼正確格式為,,,,,。驗證身份證號位或位數字驗證一年的個月正確格式為和驗證一個月的天正確格式為和。 Js代碼 function SubmitCk() { var reg = /^([a-zA-Z0-9]+[_|\_|.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|.]?)*...

    xi4oh4o 評論0 收藏0
  • IEEE754 點數格式 與 Javascript number 的特性

    摘要:類型使用的就是標準中的雙精度浮點數。數字的許多特性都依賴于此標準,例如令人費解的不等于這篇文章介紹標準中雙精度浮點數二進制儲存格式,并由此推出中數字的一些特性。 Javascript 作為一門動態語言,其數字類型只有 number 一種。 nubmer 類型使用的就是 IEEE754 標準中的 雙精度浮點數。Javascript 數字的許多特性都依賴于此標準,例如令人費解的 0.1+0...

    BigTomato 評論0 收藏0
  • ELSE 技術周刊(2017.10.16期)

    摘要:前端中的計算機領域的通常認為起源于。并對其主要內容作了自己的解讀。搬到另一個地區會導致名氣降低。年度報告,年最受歡迎的編程語言年上最流行的種編程語言及前十最火熱的項目排行榜,分別由及登頂。技術周刊由小組出品,匯聚一周好文章,周刊原文。 showImg(https://segmentfault.com/img/bVWHC4?w=1000&h=710); 本期推薦 反擊爬蟲,前端工程師的腦...

    0xE7A38A 評論0 收藏0
  • 「干貨」細說 Javascript 中的點數精度丟失問題(內附好課推薦)

    摘要:前言最近,朋友問了我這樣一個問題在中的運算結果,為什么是這樣的雖然我告訴他說,這是由于浮點數精度問題導致的。由于可以用階碼移動小數點,因此稱為浮點數。它的實現遵循標準,使用位精度來表示浮點數。 showImg(https://segmentfault.com/img/remote/1460000018981071); 前言 最近,朋友 L 問了我這樣一個問題:在 chrome 中的運算...

    senntyou 評論0 收藏0
  • JS數值

    摘要:由于浮點數不是精確的值,所以涉及小數的比較和運算要特別小心。根據標準,位浮點數的指數部分的長度是個二進制位,意味著指數部分的最大值是的次方減。也就是說,位浮點數的指數部分的值最大為。 一 前言 這篇文章主要解決以下三個問題: 問題1:浮點數計算精確度的問題 0.1 + 0.2; //0.30000000000000004 0.1 + 0.2 === 0.3; // ...

    williamwen1986 評論0 收藏0

發表評論

0條評論

warkiz

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<