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

看板C_and_CPP作者 (-858993460)時間14年前 (2010/10/24 11:42), 編輯推噓5(503)
留言8則, 5人參與, 最新討論串2/3 (看更多)
※ 引述《wahaha99 (此方不可長)》之銘言: : float 在超過本身的七位有效值後面仍然有一大串無效值, : 這點是本來就知道的, 但我發現在經過 double( ) 轉換後, : 這些無效值會被完完整整的搬過去。 : 我現在想請教的是, 有沒有什麼方法, 可以把float搬過去的同時, : 把這些無效值去除掉。 : 簡單來說就像是: : float double : 0.xxxxxxxyyyyyy => 0.xxxxxxx000000 : x是有效部分, y是無效部分 : 我想過轉換回string處理, 但c++的string實在不太快; : 使用上也不太友善。(大概是因為我還不熟悉) : 不知道有什麼好方法可以建議呢? 謝謝。 其實這是我們人用十進位觀點看的結果 對電腦來說 以二進位來看的結果的確是你所要的樣子 ____ 拿 0.6 為例 它的二進位是 0.1001 取到 24 bit 就是 0.100110011001100110011010 這值的精確十進位是 0.60000002384185791015625 將這個 float 值轉成 double 後它會完整的把這些 bit 搬過去後補零 所以那個 double 也就會是 0.10011001100110011001101000000000000000000000000000000 做個比較 如果 0.6 直接設給 double 取 53 bit 是 0.10011001100110011001100110011001100110011001100110011 它的精確十進位是 0.59999999999999997779553950749686919152736663818359375 --- 回過頭來 你要的問題是想在 double 的時候把十進位的那些值切掉 但相對的對電腦 他得想辦法在二進位方面把這些差的 bit 給補上去 (你想想看在二進位方面要怎麼把上面兩個 double 的第一個變成第二個) 所以要在二進位等級把這件事解決是很難的 因此只能藉由直接操作十進位 (eg. 變成字串之後切掉) 來達成你要的效果 -- いああオレたちには見えてるモノがあるbきっと誰にも奪われないモノがあるはずさ開口一番一虚一実跳梁跋扈形影相弔yL羊頭狗肉東奔西走国士無双南柯之夢 歪も ぶ  意味がないと思えるコトがあるPきっとでも意図はそこに必ずある んの く 依依恋恋空前絶後疾風怒濤有無相生H急転直下物情騷然愚者一得相思相愛 だが ろ 無意味じゃない6あの意図 恋た で 有為転変死生有命蒼天已死黄天當立 !!6五里霧中解散宣言千錯万綜則天去私 のり -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.92 ※ 編輯: LPH66 來自: 140.112.28.92 (10/24 19:43)

10/24 19:50, , 1F
推:)
10/24 19:50, 1F

10/24 19:52, , 2F
好人 :)
10/24 19:52, 2F

10/24 20:07, , 3F
你被好人說好人了哦>.^
10/24 20:07, 3F

10/24 20:24, , 4F
原來他說的無效部份是這種,本來還以為是十進位0.75這種
10/24 20:24, 4F

10/24 20:24, , 5F
可以轉成二進位0.11的值,放進float後會有垃圾值...
10/24 20:24, 5F

10/24 20:25, , 6F
這篇分析得很清楚,推!
10/24 20:25, 6F

10/25 02:40, , 7F
推 雖然我不確定我的小數點到底是什麼 (上游給的值...)
10/25 02:40, 7F

10/25 02:40, , 8F
但我想應該是這樣來的了
10/25 02:40, 8F
文章代碼(AID): #1Cn1klBH (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Cn1klBH (C_and_CPP)