[問題] 請問如何 '較精確的' 轉換 float 到 do …

看板C_and_CPP作者 (此方不可長)時間14年前 (2010/10/24 05:57), 編輯推噓4(4023)
留言27則, 3人參與, 最新討論串1/3 (看更多)
float 在超過本身的七位有效值後面仍然有一大串無效值, 這點是本來就知道的, 但我發現在經過 double( ) 轉換後, 這些無效值會被完完整整的搬過去。 我現在想請教的是, 有沒有什麼方法, 可以把float搬過去的同時, 把這些無效值去除掉。 簡單來說就像是: float double 0.xxxxxxxyyyyyy => 0.xxxxxxx000000 x是有效部分, y是無效部分 我想過轉換回string處理, 但c++的string實在不太快; 使用上也不太友善。(大概是因為我還不熟悉) 不知道有什麼好方法可以建議呢? 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.126.29

10/24 14:00, , 1F
基本上, 沒有. 去查一下IEEE 754表示法, 了解浮點數是怎
10/24 14:00, 1F

10/24 14:00, , 2F
麼被儲存的, 會比較有感覺應該怎麼應對這種問題@_@"
10/24 14:00, 2F

10/24 14:01, , 3F
如果你懂的float跟double怎麼存在記憶體的話
10/24 14:01, 3F

10/24 14:02, , 4F
精華區: z->8->12 可以看一下. 所以要嘛一開始就使用
10/24 14:02, 4F

10/24 14:02, , 5F
直接有效數搬有效數,指數搬指數就好了
10/24 14:02, 5F

10/24 14:02, , 6F
double型態, 不然就像您說的用string來處理, 單就儲存與
10/24 14:02, 6F
這倒是沒辦法, 我是在寫plugin, 來源給什麼就只能處理什麼這樣

10/24 14:03, , 7F
顯示來看最精確的就是string, 只是沒辦法拿來運算Orz
10/24 14:03, 7F

10/24 14:09, , 8F
請問一下, 要怎麼找到10進位值的無效數部份在32bit Hex
10/24 14:09, 8F

10/24 14:10, , 9F
裡?? 在mentisa部份裡的值全是有效bit, 只是在最後一bit
10/24 14:10, 9F
這我也很好奇, 但 printf %10.10f 還是會印出來就是...

10/24 14:10, , 10F
仍然無法整乘(2)的部份, 顯示出來就變成了不精確的其他
10/24 14:10, 10F

10/24 14:11, , 11F
值了吧?? 依不精準的情況值有可能較小, 有可能較大, 有
10/24 14:11, 11F

10/24 14:11, , 12F
可能依照需要的顯示位數不同有不同的標準, 要如何能做到
10/24 14:11, 12F

10/24 14:11, , 13F
s大說的, 只挑出有效部份來搬移?_?
10/24 14:11, 13F

10/24 14:16, , 14F
float佔四個位元組的話,前三個位元組是用來儲存假數
10/24 14:16, 14F

10/24 14:16, , 15F
後一個位元組儲存指數
10/24 14:16, 15F
嗯, 感謝各位的回答,我再多研究一下 ※ 編輯: wahaha99 來自: 220.132.126.29 (10/24 15:31)

10/24 16:50, , 16F
來源的值就不精確的話, 基本上就不用想了, 除非你能預測
10/24 16:50, 16F

10/24 16:51, , 17F
值域在一個range而且是可能修復的, 不然不可能把已經失
10/24 16:51, 17F

10/24 16:51, , 18F
真的資料再還原成未失真的原樣....
10/24 16:51, 18F

10/24 16:51, , 19F
話說, 小弟我仍然沒有看懂s大的說明, 還以為沒推完Orz
10/24 16:51, 19F

10/24 16:52, , 20F
用VC斷code看, 本來float->double出來的double資料看起
10/24 16:52, 20F

10/24 16:52, , 21F
來已經是s大類似的作法了, 問題就在小弟說過的, mentisa
10/24 16:52, 21F

10/24 16:53, , 22F
裡所有bit都是精確需要的, 是因為bit數不夠(某些case是
10/24 16:53, 22F

10/24 16:54, , 23F
不可能有足夠的bit)以IEEE754的方式來儲存值域無窮多的
10/24 16:54, 23F

10/24 16:54, , 24F
實數進入有限的bit數. 所以, 回過來考慮用途或值域範圍,
10/24 16:54, 24F

10/24 16:55, , 25F
看看有沒有可能做特化處理可能比較有機會@_@"
10/24 16:55, 25F

10/24 17:14, , 26F
看得有點亂,可以舉一個具體數字當例子嗎?到底0.xxxyyy
10/24 17:14, 26F

10/24 17:15, , 27F
是長怎樣?無效值那個地方小弟不太懂
10/24 17:15, 27F
文章代碼(AID): #1Cmygok1 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Cmygok1 (C_and_CPP)