作者xxxx9659 (嘎嘎嘎嘎嘎)
看板C_and_CPP
標題Re: [問題] 新手關於資料型態轉換問題
時間Wed Aug 29 02:54:19 2012
先不要管迴圈不迴圈的
我覺得是最佳化在搞鬼
首先 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