作者alai (none)
看板C_and_CPP
標題[問題] 有關 pow() 函數
時間Tue Jul 21 23:02:13 2009
修改一下內文好了,避免大家失焦在 overload 的問題上。
但還是相當感謝推文中的板友們的指教。
============== 分隔線 =================
麻煩板友們解答一下,謝謝!
環境是使用 Dev-C++ 4.9.9.2
code:
#include <iostream>
#include <math.h> // 這裡請勿 #include <cmath>
using namespace std;
int main() {
double N = 5.0;
cout << pow(N,2.0) << endl; //輸出結果為 25.0
cout << pow(5.0,2.0) << endl; //輸出結果亦為 25.0
for(int i=0;i<=(int)pow(5.0,2.0);i++) cout << i << " ";
// 輸出結果為 0 1 2 3....23 24 25,與預期相符。
cout << endl;
for(int i=0;i<=(int)pow(N,2.0);i++) cout << i << " ";
// 輸出結果為 0 1 2 3....23 24,與預期不符,為何這裡沒有 25?
cout << endl;
system("PAUSE");
return 0;
}
真神奇!但 N 帶 2.0 進去,兩個結果又相同了!(同是 0 1 2 3 4 )
============== 分隔線 =================
P.S. 對於 overload 的問題,推文板友的解釋為下。
在 include <math.h> 的前提下,
pow() 函數第一個參數帶 int 型態的引數進去,
Dev-C++ 4.9.9.2 可以 compile 過,是因為
→ akasan:math.h會過應該是因為C沒有function overload的關係... → akasan:在VC所提供的math.h中則有用ifdef來定義C跟C++的情況 --
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.170.195.53
→ QQting:把pow()內參數的型態用double帶入應該可以解決@@ 07/21 23:44
→ QQting:double N = 5.0; pow(N, 2.0) 07/21 23:46
推 VictorTom:我用dev-C++ 4.9.9.2, 你原來的code連compile都不給過. 07/22 00:21
→ VictorTom:把pow第一參數改浮點型態才行, 不然會一直報ambigous. 07/22 00:22
→ VictorTom:把第一參數用(float)或(double)轉型以後, 兩個跑出來都 07/22 00:23
→ VictorTom:是對的; 照QQ大說的改double或float N, 出來也都是對的. 07/22 00:24
推 VictorTom:你要不要重新check一下你的code或開發環境先....@_@" 07/22 00:26
→ alai:我 dev 的版本跟你一樣的耶,奇怪,上面的 code 我剛再複製貼 07/22 00:28
→ alai:上,有 compile 過耶.. 07/22 00:29
→ alai:我的 OS 是 vista 的,有關係嗎 QQ 07/22 00:30
→ alai:我也有試過將第一參數用 (double) 轉型,但結果還是一樣.. 07/22 00:33
推 VictorTom:我大概試出問題了, 你八成用的是 #include <math.h> 07/22 00:46
→ VictorTom:我 #include <cmath> 加上 using namespace std; 07/22 00:46
→ VictorTom:報error的是 std::pow(), 所以run也是用 std::pow() . 07/22 00:47
→ VictorTom:如果我改用math.h裡的pow()就不會error, 也可以做出同 07/22 00:47
→ VictorTom:樣的錯誤了; 至於理由~~不知道, 有空再換compile試~_~ 07/22 00:50
→ alai:沒錯,我是用 math.h,那可以解釋一下,為何 int 型態的值不 07/22 00:54
→ alai:能指定給 double 參數呢? 07/22 00:54
推 VictorTom:另外, 用 #define N 5 或者 const int N=5; 都是對的@@ 07/22 00:54
→ alai:const int N =5 應該跟直接帶 5 是一樣的效果吧 07/22 00:56
推 VictorTom:同樣的code我用VC++2005測是正常的, 所以如果不是這之 07/22 01:05
→ VictorTom:中有什麼undefined behavior, 那就可以是dev-c++用的 07/22 01:06
→ VictorTom:math.h的library有bug吧....?_? 07/22 01:06
推 VictorTom:忘了說, VC++2005下就算用math.h的pow(), 第一個參數給 07/22 01:11
→ VictorTom:int也是報error, error理由很簡單, pow()有幾種不同的 07/22 01:11
→ VictorTom:overloading, 報錯是因為compiler不知道該幫你挑哪一種 07/22 01:12
→ VictorTom:來用, 如果它只有實作pow(double,double)那可能另當別論 07/22 01:12
→ VictorTom:現在有pow(double,int), pow(double,double), 有 07/22 01:13
→ VictorTom:pow(float,float), 等等等; compiler怎麼知道要挑哪一個 07/22 01:13
→ VictorTom:雖然說也許你這個case理論上跑出來不會有太大差別@_@" 07/22 01:14
→ alai:謝謝 V 大熱心解答^^ 07/22 09:19
推 hilorrk:我想應該是double的問題 只要有double型態出現就有可能會 07/22 11:30
→ hilorrk:不精準...還記得強制cast的運作方式嗎? 而用math.h和cmath 07/22 11:31
→ hilorrk:的差別應該是math.h的pow都是double型態 cmath不是吧... 07/22 11:31
推 VictorTom:他的問題不是這個, 這問題很怪是在dev-C++跑出來.... 07/22 11:44
→ VictorTom:double N=5.0; pow(N, 2); 拿來當loop終止條件的結果. 07/22 11:44
→ VictorTom:與 pow(5.0, 2) 當終止條件跑出來的結果不一樣.... 07/22 11:45
→ VictorTom:雖然你把兩個 pow() 直接print出來都是25.0沒錯~_~ 07/22 11:45
→ akasan:math.h會過應該是因為C沒有function overload的關係... 07/22 17:32
→ akasan:在VC所提供的math.h中則有用ifdef來定義C跟C++的情況 07/22 17:35
※ 編輯: alai 來自: 118.170.195.53 (07/22 18:51)