Использование pow () дает ошибки

Пожалуйста, посмотрите на следующий код

#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&Int&) «неоднозначно». Этого не произойдет, если я просто использую ручную работу, например, i * i, вместо метода. Может кто-нибудь объяснить, почему это происходит? Я новичок в C ++ в любом случае. Спасибо

2

Решение

Есть несколько перегрузок для pow определяется в <cmath>, В вашем коде все эти 3 одинаково действительны, поэтому у компилятора возникают проблемы с выбором правильного:

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

Самое простое решение — использовать static_cast по первому аргументу, чтобы устранить любую неопределенность. например

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

Другие решения

Вау! Pow (x, y) — это x, повышенное до y-й степени (в математических терминах — xY) !! НЕ х * у

Итак, вы пытаетесь взять меняIth сила в 5003 вложенный цикл Наверное, не то, что вы хотите. Замените на pow (i, 2) для вашего желаемого поведения.

Обратите внимание, @Mooing Duck поднимает отличную мысль о x ^ y в c ++, который является оператором XOR. Но я думаю, вы поняли это, если уже используете pow тем не мение.

4

Он не может выяснить, какую перегруженную функцию использовать.
Пытаться

pow(double(i), i);

или же

pow(double(i), 2);

Так как это похоже на то, что вы хотите.

0

Ты уверен, что справишься с таким большим пухом?

Пау (х, у) хY. Посмотрите на

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

двойной пау (двойное основание, двойная экспонента);

длинный двойной пау (длинное двойное основание, длинный двойной показатель);

float pow (основа поплавка, показатель поплавка);

двойной пау (двойное основание, int экспонента);

длинный двойной пау (длинное двойное основание, показатель степени int);

Нет версии INT. Ваш компилятор не знал, какой из них правильный. Вы должны сказать им, используя static_cast как:

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

Для большой точности расчета вы можете использовать:

http://gmplib.org/

Существует также одно решение от повышения.

0