看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) MinGW g++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我有天剛好需要算到98的5次方時,想說使用cmath/math.h的 pow()函式來運算 發現float的98^5竟然和double的98^5算出來不一樣,直接差在整數位 可是後來去查,發現pow也有float的overloading呀 之後又試了powf(),發現結果還是一樣錯....用codepad跑過也是一樣錯... 後來又用了cmath和math.h都試了也是一樣,不知是否是我誤用? 如果是的話,要怎麼正確對單精度浮點數作指數運算呢? 餵入的資料(Input): 98.0f的 5.0f 次方 預期的正確結果(Expected Output): 9039207968.000000 錯誤結果(Wrong Output): 9039208448.000000 程式碼(Code):(請善用置底文網頁, 記得排版) http://codepad.org/sdqGxWaH 補充說明(Supplement): 詳細就如codepad連結 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.20.69 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1431106642.A.F10.html
sunev: 你知道float精確到幾位嗎? 05/09 01:40
la8day: 我有想過,可是我以為精確度問題只會出現在小數很後面 05/09 01:44
la8day: 有點難想像整數部分會差這麼多 05/09 01:47
azureblaze: 你知道精度的定義嗎 05/09 01:59
prismwu: wiki IEEE 754 05/09 02:01
azureblaze: _.________*10^(+/-)__ 這個格式塞你的答案下去差多少 05/09 02:03
la8day: 抱歉我確實覺得有點問題 但好像還沒抓到造成這樣差異的點 05/09 02:06
la8day: 98 = 1.53125 * 2^6 , 5 = 1.25 * 2^2 05/09 02:07
la8day: 在經過反覆運算後 mantisa的部分誤差已經太大? 05/09 02:08
la8day: OK我搞懂了 感謝azureblaze大...我順便複習了一下754 05/09 02:14
la8day: 我以前好像誤解ieee 754的設計只會差在小數點 冏 05/09 02:16
LPH66: IEEE754 就只是二進位科學記號表示法, 跟我們熟知的十進位 05/09 05:28
LPH66: 科學記號表示法除了進位不同外其他方面都是一樣的 05/09 05:28
LPH66: 所以一些計算上的誤差性質也是一樣的 05/09 05:29
LPH66: 就像我們寫 6.02*10^23 不表示精確度到得了個位數 05/09 05:31
Killercat: float的老問題了,這在3D圖學是個很常見的雷 05/10 22:49
Killercat: float精度其實完全不看小數點的 只看有效位數 05/10 22:49