今天在做題的時候用到了cmath庫中的pow()函式;
結果和我的預料出現了很大的偏差
這一段部分代碼
string row = "AA";
int row_num = 0;
for(int i=0,len = row.length();i<len;i++)
{
row_num += ((row[i]-'A'+1)*pow(26,(len-1-i)));
}
我原以為最后row_num的值為27,但結果是26 ,為了知道哪里出錯了我就把中間值輸出,之一輸出就發現了大問題,很迷很迷,百思不得其解,
我先輸出了這個((row[i]-'A'+1)*pow(26,(len-1-i))) 第一次是26,第二次是1
???不對啊,結果加起來應該是27啊,為什么輸出是26呢??
然后我繼續輸出每次的row_num,問題來了 第一次回圈row_num = 25 ???為啥是25,不是26嗎,我再輸出這個 cout<<((row[i]-'A'+1)*pow(26,(len-1-i)))<<endl; 嗯,沒錯是26 , 但為什么賦值給row_num之后就變成25了呢?
這就是我今天所說的關于pow()函式的迷
很遺憾,目前我還無法解釋為什么,如果有兄弟明白歡迎留言,
我經過一系列的嘗試發現了以下現象:
int x = pow(26,1);
cout<<"x = "<<x<<endl;
毫無疑問輸出結果是26;
重點來了
int t = 2;
int x = pow(26,t-1); // int x = pow(26,(t-1)); 加不加括號沒區別,結果都一樣
cout<<"x = "<<x<<endl;
神奇的一幕出現了,你們以為結果是26吧,很遺憾,輸出結果是25 , 我也不知道為什么,
繼續試驗:
int t = 2;
double x = pow(26,t-1);
int y = x;
cout<<"y = "<<y<<endl;
這個時候結果輸出是26;這是為什么?可能一開始有朋友說pow回傳值是double,轉換成int后精度變了,但是我現在轉成int了結果還是26啊,為什么直接轉就成25,間接轉就成26了呢?
而且 為什么就因為pow的第二個引數多了個變數,或者說多了個運算式 結果就不一樣了呢? 是運算式的鍋,還是變數的鍋?
繼續試驗:
int x = pow(26,2-1);
cout<<"x = "<<x<<endl;
這次輸出是26,似乎與運算式無關,是因為變數的原因
int t = 1;
int x = pow(26,t);
這次輸出是25,好像一切都因為這個變數,
pow的引數應該也是double型的,是因為int的原因嗎?
double t = 1;
int x = pow(26,t);
很遺憾結果還是25;
double t = 1;
double x = pow(26,t);
int y = x;
cout<<"y = "<<y<<endl;
這次結果是26;
我懵了,有好兄弟能解答以下在下的困惑嗎,球球了,
我總結一下:
pow()有很多多載,就是沒有int pow(int,int)
那怎么辦呢?
經過我的嘗試發現引數都無所謂,就回傳型別會出現問題,
如果你要用int 那么引數正常,讓回傳值賦值給double型變數,再把這個變數的值賦值給你要用了int型變數就行了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/2809.html
標籤:其他
