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

作者: la8day (la8day)   2015-05-09 01:37:19
開發平台(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連結
作者: sunev (Veritas)   2015-05-09 01:40:00
你知道float精確到幾位嗎?
作者: la8day (la8day)   2015-05-09 01:44:00
我有想過,可是我以為精確度問題只會出現在小數很後面有點難想像整數部分會差這麼多
作者: azureblaze (AzureBlaze)   2015-05-09 01:59:00
你知道精度的定義嗎
作者: prismwu   2015-05-09 02:01:00
wiki IEEE 754
作者: azureblaze (AzureBlaze)   2015-05-09 02:03:00
_.________*10^(+/-)__ 這個格式塞你的答案下去差多少
作者: la8day (la8day)   2015-05-09 02:06:00
抱歉我確實覺得有點問題 但好像還沒抓到造成這樣差異的點98 = 1.53125 * 2^6 , 5 = 1.25 * 2^2在經過反覆運算後 mantisa的部分誤差已經太大?OK我搞懂了 感謝azureblaze大...我順便複習了一下754我以前好像誤解ieee 754的設計只會差在小數點 冏
作者: LPH66 (-6.2598534e+18f)   2015-05-09 05:28:00
IEEE754 就只是二進位科學記號表示法, 跟我們熟知的十進位科學記號表示法除了進位不同外其他方面都是一樣的所以一些計算上的誤差性質也是一樣的就像我們寫 6.02*10^23 不表示精確度到得了個位數
作者: Killercat (殺人貓™)   2015-05-10 22:49:00
float的老問題了,這在3D圖學是個很常見的雷float精度其實完全不看小數點的 只看有效位數

Links booklink

Contact Us: admin [ a t ] ucptt.com