[問題] 有關 pow() 函數

看板C_and_CPP (C/C++)作者 (none)時間16年前 (2009/07/21 23:02), 編輯推噓9(9032)
留言41則, 5人參與, 最新討論串1/2 (看更多)
修改一下內文好了,避免大家失焦在 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

07/21 23:43, , 1F
07/21 23:43, 1F

07/21 23:44, , 2F
把pow()內參數的型態用double帶入應該可以解決@@
07/21 23:44, 2F

07/21 23:46, , 3F
double N = 5.0; pow(N, 2.0)
07/21 23:46, 3F

07/22 00:21, , 4F
我用dev-C++ 4.9.9.2, 你原來的code連compile都不給過.
07/22 00:21, 4F

07/22 00:22, , 5F
把pow第一參數改浮點型態才行, 不然會一直報ambigous.
07/22 00:22, 5F

07/22 00:23, , 6F
把第一參數用(float)或(double)轉型以後, 兩個跑出來都
07/22 00:23, 6F

07/22 00:24, , 7F
是對的; 照QQ大說的改double或float N, 出來也都是對的.
07/22 00:24, 7F

07/22 00:26, , 8F
你要不要重新check一下你的code或開發環境先....@_@"
07/22 00:26, 8F

07/22 00:28, , 9F
我 dev 的版本跟你一樣的耶,奇怪,上面的 code 我剛再複製貼
07/22 00:28, 9F

07/22 00:29, , 10F
上,有 compile 過耶..
07/22 00:29, 10F

07/22 00:30, , 11F
我的 OS 是 vista 的,有關係嗎 QQ
07/22 00:30, 11F

07/22 00:33, , 12F
我也有試過將第一參數用 (double) 轉型,但結果還是一樣..
07/22 00:33, 12F

07/22 00:46, , 13F
我大概試出問題了, 你八成用的是 #include <math.h>
07/22 00:46, 13F

07/22 00:46, , 14F
我 #include <cmath> 加上 using namespace std;
07/22 00:46, 14F

07/22 00:47, , 15F
報error的是 std::pow(), 所以run也是用 std::pow() .
07/22 00:47, 15F

07/22 00:47, , 16F
如果我改用math.h裡的pow()就不會error, 也可以做出同
07/22 00:47, 16F

07/22 00:50, , 17F
樣的錯誤了; 至於理由~~不知道, 有空再換compile試~_~
07/22 00:50, 17F

07/22 00:54, , 18F
沒錯,我是用 math.h,那可以解釋一下,為何 int 型態的值不
07/22 00:54, 18F

07/22 00:54, , 19F
能指定給 double 參數呢?
07/22 00:54, 19F

07/22 00:54, , 20F
另外, 用 #define N 5 或者 const int N=5; 都是對的@@
07/22 00:54, 20F

07/22 00:56, , 21F
const int N =5 應該跟直接帶 5 是一樣的效果吧
07/22 00:56, 21F

07/22 01:05, , 22F
同樣的code我用VC++2005測是正常的, 所以如果不是這之
07/22 01:05, 22F

07/22 01:06, , 23F
中有什麼undefined behavior, 那就可以是dev-c++用的
07/22 01:06, 23F

07/22 01:06, , 24F
math.h的library有bug吧....?_?
07/22 01:06, 24F

07/22 01:11, , 25F
忘了說, VC++2005下就算用math.h的pow(), 第一個參數給
07/22 01:11, 25F

07/22 01:11, , 26F
int也是報error, error理由很簡單, pow()有幾種不同的
07/22 01:11, 26F

07/22 01:12, , 27F
overloading, 報錯是因為compiler不知道該幫你挑哪一種
07/22 01:12, 27F

07/22 01:12, , 28F
來用, 如果它只有實作pow(double,double)那可能另當別論
07/22 01:12, 28F

07/22 01:13, , 29F
現在有pow(double,int), pow(double,double), 有
07/22 01:13, 29F

07/22 01:13, , 30F
pow(float,float), 等等等; compiler怎麼知道要挑哪一個
07/22 01:13, 30F

07/22 01:14, , 31F
雖然說也許你這個case理論上跑出來不會有太大差別@_@"
07/22 01:14, 31F

07/22 09:19, , 32F
謝謝 V 大熱心解答^^
07/22 09:19, 32F

07/22 11:30, , 33F
我想應該是double的問題 只要有double型態出現就有可能會
07/22 11:30, 33F

07/22 11:31, , 34F
不精準...還記得強制cast的運作方式嗎? 而用math.h和cmath
07/22 11:31, 34F

07/22 11:31, , 35F
的差別應該是math.h的pow都是double型態 cmath不是吧...
07/22 11:31, 35F

07/22 11:44, , 36F
他的問題不是這個, 這問題很怪是在dev-C++跑出來....
07/22 11:44, 36F

07/22 11:44, , 37F
double N=5.0; pow(N, 2); 拿來當loop終止條件的結果.
07/22 11:44, 37F

07/22 11:45, , 38F
與 pow(5.0, 2) 當終止條件跑出來的結果不一樣....
07/22 11:45, 38F

07/22 11:45, , 39F
雖然你把兩個 pow() 直接print出來都是25.0沒錯~_~
07/22 11:45, 39F

07/22 17:32, , 40F
math.h會過應該是因為C沒有function overload的關係...
07/22 17:32, 40F

07/22 17:35, , 41F
在VC所提供的math.h中則有用ifdef來定義C跟C++的情況
07/22 17:35, 41F
※ 編輯: alai 來自: 118.170.195.53 (07/22 18:51)
文章代碼(AID): #1APTXuPz (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1APTXuPz (C_and_CPP)