[問題] pow() powf() 算float算錯?

看板C_and_CPP (C/C++)作者 (la8day)時間11年前 (2015/05/09 01:37), 編輯推噓2(2015)
留言17則, 6人參與, 最新討論串1/1
開發平台(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

05/09 01:40, , 1F
你知道float精確到幾位嗎?
05/09 01:40, 1F

05/09 01:44, , 2F
我有想過,可是我以為精確度問題只會出現在小數很後面
05/09 01:44, 2F

05/09 01:47, , 3F
有點難想像整數部分會差這麼多
05/09 01:47, 3F

05/09 01:59, , 4F
你知道精度的定義嗎
05/09 01:59, 4F

05/09 02:01, , 5F
wiki IEEE 754
05/09 02:01, 5F

05/09 02:03, , 6F
_.________*10^(+/-)__ 這個格式塞你的答案下去差多少
05/09 02:03, 6F

05/09 02:06, , 7F
抱歉我確實覺得有點問題 但好像還沒抓到造成這樣差異的點
05/09 02:06, 7F

05/09 02:07, , 8F
98 = 1.53125 * 2^6 , 5 = 1.25 * 2^2
05/09 02:07, 8F

05/09 02:08, , 9F
在經過反覆運算後 mantisa的部分誤差已經太大?
05/09 02:08, 9F

05/09 02:14, , 10F
OK我搞懂了 感謝azureblaze大...我順便複習了一下754
05/09 02:14, 10F

05/09 02:16, , 11F
我以前好像誤解ieee 754的設計只會差在小數點 冏
05/09 02:16, 11F

05/09 05:28, , 12F
IEEE754 就只是二進位科學記號表示法, 跟我們熟知的十進位
05/09 05:28, 12F

05/09 05:28, , 13F
科學記號表示法除了進位不同外其他方面都是一樣的
05/09 05:28, 13F

05/09 05:29, , 14F
所以一些計算上的誤差性質也是一樣的
05/09 05:29, 14F

05/09 05:31, , 15F
就像我們寫 6.02*10^23 不表示精確度到得了個位數
05/09 05:31, 15F

05/10 22:49, , 16F
float的老問題了,這在3D圖學是個很常見的雷
05/10 22:49, 16F

05/10 22:49, , 17F
float精度其實完全不看小數點的 只看有效位數
05/10 22:49, 17F
文章代碼(AID): #1LJFHIyG (C_and_CPP)
文章代碼(AID): #1LJFHIyG (C_and_CPP)