Re: [問題] 新手關於資料型態轉換問題
先不要管迴圈不迴圈的
我覺得是最佳化在搞鬼
首先 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
→
08/29 03:26, , 1F
08/29 03:26, 1F
→
08/29 03:26, , 2F
08/29 03:26, 2F
推
08/29 04:02, , 3F
08/29 04:02, 3F
→
08/29 04:02, , 4F
08/29 04:02, 4F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
1
17
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章