看板 C_and_CPP 關於我們 聯絡資訊
float 在超過本身的七位有效值後面仍然有一大串無效值, 這點是本來就知道的, 但我發現在經過 double( ) 轉換後, 這些無效值會被完完整整的搬過去。 我現在想請教的是, 有沒有什麼方法, 可以把float搬過去的同時, 把這些無效值去除掉。 簡單來說就像是: float double 0.xxxxxxxyyyyyy => 0.xxxxxxx000000 x是有效部分, y是無效部分 我想過轉換回string處理, 但c++的string實在不太快; 使用上也不太友善。(大概是因為我還不熟悉) 不知道有什麼好方法可以建議呢? 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.126.29
VictorTom:基本上, 沒有. 去查一下IEEE 754表示法, 了解浮點數是怎 10/24 14:00
VictorTom:麼被儲存的, 會比較有感覺應該怎麼應對這種問題@_@" 10/24 14:00
stupid0319:如果你懂的float跟double怎麼存在記憶體的話 10/24 14:01
VictorTom:精華區: z->8->12 可以看一下. 所以要嘛一開始就使用 10/24 14:02
stupid0319:直接有效數搬有效數,指數搬指數就好了 10/24 14:02
VictorTom:double型態, 不然就像您說的用string來處理, 單就儲存與 10/24 14:02
這倒是沒辦法, 我是在寫plugin, 來源給什麼就只能處理什麼這樣
VictorTom:顯示來看最精確的就是string, 只是沒辦法拿來運算Orz 10/24 14:03
VictorTom:請問一下, 要怎麼找到10進位值的無效數部份在32bit Hex 10/24 14:09
VictorTom:裡?? 在mentisa部份裡的值全是有效bit, 只是在最後一bit 10/24 14:10
這我也很好奇, 但 printf %10.10f 還是會印出來就是...
VictorTom:仍然無法整乘(2)的部份, 顯示出來就變成了不精確的其他 10/24 14:10
VictorTom:值了吧?? 依不精準的情況值有可能較小, 有可能較大, 有 10/24 14:11
VictorTom:可能依照需要的顯示位數不同有不同的標準, 要如何能做到 10/24 14:11
VictorTom:s大說的, 只挑出有效部份來搬移?_? 10/24 14:11
stupid0319:float佔四個位元組的話,前三個位元組是用來儲存假數 10/24 14:16
stupid0319:後一個位元組儲存指數 10/24 14:16
嗯, 感謝各位的回答,我再多研究一下 ※ 編輯: wahaha99 來自: 220.132.126.29 (10/24 15:31)
VictorTom:來源的值就不精確的話, 基本上就不用想了, 除非你能預測 10/24 16:50
VictorTom:值域在一個range而且是可能修復的, 不然不可能把已經失 10/24 16:51
VictorTom:真的資料再還原成未失真的原樣.... 10/24 16:51
VictorTom:話說, 小弟我仍然沒有看懂s大的說明, 還以為沒推完Orz 10/24 16:51
VictorTom:用VC斷code看, 本來float->double出來的double資料看起 10/24 16:52
VictorTom:來已經是s大類似的作法了, 問題就在小弟說過的, mentisa 10/24 16:52
VictorTom:裡所有bit都是精確需要的, 是因為bit數不夠(某些case是 10/24 16:53
VictorTom:不可能有足夠的bit)以IEEE754的方式來儲存值域無窮多的 10/24 16:54
VictorTom:實數進入有限的bit數. 所以, 回過來考慮用途或值域範圍, 10/24 16:54
VictorTom:看看有沒有可能做特化處理可能比較有機會@_@" 10/24 16:55
purpose:看得有點亂,可以舉一個具體數字當例子嗎?到底0.xxxyyy 10/24 17:14
purpose:是長怎樣?無效值那個地方小弟不太懂 10/24 17:15