[爆卦]Std::pow是什麼?優點缺點精華區懶人包

為什麼這篇Std::pow鄉民發文收入到精華區:因為在Std::pow這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者alai (none)看板C_and_CPP標題[問題] 有關 pow() 函數時間Tue Ju...


修改一下內文好了,避免大家失焦在 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:http://0rz.tw/U1qVE 07/21 23:43
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)

你可能也想看看

搜尋相關網站