Re: [問題] C 的float涵蓋單精的非正規化denormalized嗎?

看板C_and_CPP作者 (-858993460)時間15年前 (2011/02/17 13:24), 編輯推噓1(105)
留言6則, 1人參與, 最新討論串1/1
※ 引述《ironmanstock (鋼鐵人史塔克)》之銘言: : hi,大家好 : 請問C 的float就是代表了IEEE 754單精的正規化嗎? : C float 可以表達的範圍也包含了 IEEE 754的非正規化的那部份嗎? : 還是 C 的 float僅僅是 IEEE 754的 正規化的實現? : 以下是我對IEEE 754 normalize 跟 denormalize 的認知: : IEEE 754 的單精 可以分成 : 正規化跟非正規化,非正規化應該就是為了表達比正規化更小的值(先不談正負), : 所以它的數值大小範圍是 承接了正規化的範圍往下走(愈來愈小),也就是更小更接近零, : (不管正規還是非正規,正負的差別只是Sign bit 是1或0不同而已, : IEEE 754 數值大小的E 跟 M的欄位的表示跟正負毫無關係,只要先表示好大小, : 再把sign bit改成1,就變成負的值了。) : 我不知以上的了解對不對?目前我的疑惑是 C 的float 是 IEEE 754 的全部實現嗎? : 我對於C 的 float的範圍看到書講 :C 的float就是單精準確, : 其他的我還弄不清楚? ( C float IEEE 754 兩者的正確關係我還沒摸索出來。) 目前你的理解差不多都是對的 C 語言來說理論上都是 IEEE754 沒錯 (而且都有實作) 除非是在一些比較奇怪的機器上預設不用 IEEE754 的可能才會有差 : meanwhile,我也不懂為何說C float的小數點有效位數是七位數或..?這跟正規化有關嗎? 這倒不是 首先一個觀念是: IEEE754 其實就是二進位的科學記號表示法 例如十進位的 19.25 = 二進位的 10011.01 科學記號記做 1.001101 x 2^4 所以在 mantissa 欄位就記下 0011010000.....0 即小數之後的部份 (那個 4 則經過 bias 127 之後存進 exp 欄位裡 這就不需多說了) 也就是說 mantissa 欄位就是科學記號裡前方數字的部份 它的位數就是你的數字的有效位數 那麼對 float 來說 這裡有 23+1 個 bit (記得那個一定會在小數點前的 1 也得算進去) 因此它一共是二進位 24 位有效 換算成十進位就是 24*log2 = 24*0.301 = 7.224 位了 也就是說 轉換成十進位之後 七位是準的 第八位不怎麼準 之後都不準 所以有效位數就會說是十進位的七位 : 請幫我看看我哪裡講錯了,並教我一下, 謝謝。 -- 有人喜歡邊玩遊戲上逼; 也有人喜歡邊聽歌打字。 但是,我有個請求, 選字的時候請專心好嗎? -- 改編自「古 火田 任三郎」之開場白 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.254.23.234

02/17 14:55, , 1F
因為單精正規化裡,正的最小只能到 +1*(2的-126次方),
02/17 14:55, 1F

02/17 14:56, , 2F
C 的float如果還包含了非正規化的範圍部份,
02/17 14:56, 2F

02/17 14:59, , 3F
那C float正負範圍(非正規化延長了接近零範圍)寫成:
02/17 14:59, 3F

02/17 15:02, , 4F
正 +1.0*(2的-149次方) ~ +1.11...1*(2的127次方)
02/17 15:02, 4F

02/17 15:03, , 5F
負 -1.0*(2的-149次方) ~ -1.11..11*(2的127次方)
02/17 15:03, 5F

02/17 15:04, , 6F
請問C float的範圍是這樣大小嗎?
02/17 15:04, 6F
文章代碼(AID): #1DNB4JlA (C_and_CPP)