你如何在c ++中使用带变量的指数?

时间:2009-04-03 05:10:39

标签: c++ variables exponent

所以我意识到#include是必要的,并且有一个pow(x,y),其中x ^ y可以工作......但是当我尝试使用pow(2,(num-1))时,它被踢了回来一个错误...

errorC2668:'pow':对重载函数的模糊调用

我的代码行如下

perfect = (pow(2,(num-1))) * (pow(2,num)-1);

有什么建议吗?

提前致谢

编辑:

num确实被声明为int。

num确实有一个值,从1开始并转到UINT_MAX

在等式

中添加了星号

5 个答案:

答案 0 :(得分:8)

编译器不知道要调用哪个pow()函数。列出的重载here给出了以下列表:

      float pow (       float base,       float exponent );
     double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,         int exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );

编译器不会猜测要使用哪一个。用演员表明白。

perfect = (pow(2.,(double)(num-1))) < (pow(2.,(double)num)-1);

那里可能会有一些额外的演员,但他们不会伤害任何东西。

答案 1 :(得分:2)

这些是C ++中允许的pow()函数。问题是你的代码有一个int作为第一个参数,C ++不知道是否将它提升为double或long double。

     double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,       float exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );

尝试加入(double)2而非2

perfect = (pow((double)2,(num-1))) * (pow((double)2,num)-1)

答案 2 :(得分:1)

添加缺失的乘法(或你想要的),并且在行的末尾应该有分号:

perfect = (pow(2,(num-1))) * (pow(2,num)-1) ;

答案 3 :(得分:1)

来自error C2668: 'pow' : ambiguous call to overloaded function in VC++ 2005 only,alex.m写道,

  

“pow”(任何超载)需要浮动   点类型编号(单,双或   长双精度)作为第一   参数,不是整数。这是   错误来自哪里,因为   编译器无法猜测你想要的方式   要转换的长整数。

     

试着写一个演员表达,   像这样:

     

代码块

     

c =   POW((双)numberOfScansCompleted,   2);

因此,如果您尝试pow((double)2,(num-1)),它应该有效。


有趣的旁注,当我在谷歌中输入它的开头时,“对于过载功能的粉丝模糊调用”出现在顶部建议的搜索中。

答案 4 :(得分:0)

请记住,您还可以使用移位运算符写出2的整数次幂:

int perfect = (1<<(num-1)) * ((1<<num) - 1);

或使用ldexp(也包含在<cmath>中):

double perfect = ldexp(1.0, num-1) * (ldexp(1.0, num) - 1);
相关问题