使用pow()会产生错误

时间:2012-09-19 18:25:35

标签: c++ math cmath

请查看以下代码

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main()
{
    //int side1 = 0;
    //int side2 = 0;
    //int rightSide = 0;

    cout << "Right Side" << setw(10) << "Side1" << setw(10) << "Side2" << endl;

    for(int i=1;i<=500;i++)
    {
        //side1++;
        //cout << side1 << endl;

        for(int a=1;a<=500;a++)
        {
            //side2++;
            //cout << "side 2 " << side2 << endl;

            for(int c=1;c<=500;c++)
            {
                //rightSide++;
                int rightSideSqr = pow(c,c);
                int side1Sqr = pow(i,i);
                int side2Sqr = pow(a,a);

                if(rightSideSqr == (side1Sqr+side2Sqr))
                {
                    cout << rightSideSqr << setw(15) << i << setw(10) << a << endl;
                 }


            }
        }
    }
}

这给出了一个错误“PythagorialTriples.cpp:28:错误:调用过载的`pow(int&amp;,int&amp;)'是不明确的”。如果我只使用像i * i这样的手动电源而不是方法,就不会发生这种情况。有人可以解释一下为什么会这样吗?无论如何,我是C ++的新手。感谢

4 个答案:

答案 0 :(得分:9)

pow中定义的<cmath>存在多个重载。在您的代码中,这3个都同样有效,因此编译器在选择正确的代码时遇到了问题:

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

最简单的解决方案是在第一个参数上使用static_cast,以消除任何歧义。 e.g。

int side1Sqr = pow( static_cast<double>(i) ,i );
int side2Sqr = pow( static_cast<double>(a) ,a );

答案 1 :(得分:4)

哇! Pow(x,y)是x被提升到y次幂(用数学术语来说 - x y )!!不是x * y

所以你试图在500 3 嵌套循环中获取i ith 幂。可能不是你想要的。用pow(i,2)代替你想要的行为。

注意,@ Momoo Duck在c ++中提出了一个关于x ^ y的优秀观点,它是XOR运算符。但是,如果你已经使用pow,我认为你有点想出来。

答案 2 :(得分:0)

你确定你可以处理这么大的战俘吗?

Pow(x,y)是x y

http://www.cplusplus.com/reference/clibrary/cmath/pow/

  

double pow(双基,双指数);

     

长双功率(长双基,长双指数);

     

float pow(float base,float exponent);

     

double pow(double base,int exponent);

     

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

没有INT版本。你的编译器不知道哪一个是正确的。你必须使用static_cast告诉他们:

int side1Sqr = pow(static_cast<double>i,i);

对于大精度计算你可以使用:

http://gmplib.org/

还有一个来自boost的解决方案。

答案 3 :(得分:0)

无法确定要使用哪个重载函数。 尝试

pow(double(i), i);

pow(double(i), 2);

因为这看起来像你想要的。