关于cmath中pow()函数 的谜之bug有好兄弟解答解答吗?球球了

今天在做题的时候用到了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)))< 嗯,没错是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型变量就行了。

你可能感兴趣的:(C/C++)