看板 C_and_CPP 關於我們 聯絡資訊
先不要管迴圈不迴圈的 我覺得是最佳化在搞鬼 首先 dev-c++ 的編譯器他看到 pow(10, 2) 兩個參數都是常數 以編譯器本身的聰明腦袋 他覺得這算都不用算直接把 pow 函式取代為 100 你可以試試看以下的 code 跟我的解果一不一樣 double d = 2.0; const double D = 2.0; const volatile double VD = 2.0; printf("字面常數 幫你最佳化 --\n"); printf("(int)pow(10.0, 2.0 ): %d\n", (int)pow(10.0, 2.0 )); //100 printf("常數 幫你最佳化 --\n"); printf("(int)pow(10.0, D ): %d\n", (int)pow(10.0, D )); //100 printf("變數 沒有最佳化 --\n"); printf("(int)pow(10.0, d ): %d\n", (int)pow(10.0, d )); //99 printf("常數 但是沒有最佳化 --\n"); printf("(int)pow(10.0, VD ): %d\n", (int)pow(10.0, VD )); //99 再來討論變成 99 的問題 先用一個 double 變數把 pow(10.0, d) 存起來 再把此變數轉成 int 印出來是正確的解果 100 !!! 但是直接印 (int)pow(10.0, d) 會等於 99 !!!!? 這是為什麼 我也不知... 個人推測也是跟最佳化有關 編譯器會把 (int)pow(...) 當成一個片語看待 只要遇到這種狀況 編譯器就認為 pow(...) 不用算這麼精確 因為算完馬上就要轉成 int 哪需要算到小數點第幾位 導致算出來解果有誤差??? 以上只是胡亂猜測 如果有人看到有錯 請大方指正一起討論 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.60.254.49
EdisonX:pow會有誤差不意外,pow(a,b)一種可能做法是exp(b log(a) ) 08/29 03:26
EdisonX:< 當然還有經過一些化簡... > 08/29 03:26
EdisonX:補一下,你講的算對,但真正影響的是 -ffloat-store ,這個 08/29 04:02
EdisonX:opt. 會隨 -O? 不同而 on/off http://0rz.tw/uxml9 2F 08/29 04:02