Ошибка компилятора: непревзойденный вызов pow (...) - PullRequest
1 голос
/ 26 января 2011

В моей компании есть программное обеспечение, имеющее довольно большую кодовую базу. Недавно мне было поручено проверить, скомпилируется ли код для цели x86_64 с использованием gcc 4.1.2. Я довольно далеко продвинулся в компиляции с очень незначительными изменениями кода, но только сегодня утром я получил несколько запутанную ошибку компиляции.

Код пытается и не может вызвать pow из <cmath>, используя int, unsigned int& в качестве параметров. Компилятор выдает ошибку, потому что не может найти подходящее совпадение для вызова. Перегрузки для pow в <cmath> следующие:

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)

Я не совсем уверен, почему это основано на наших 32-битных средах, но сейчас это не относится к делу.

У меня вопрос: как мне привести параметры, какие pow мне следует использовать? Спасибо.

P.S. Я не могу изменить тип данных параметров, так как это потребует слишком много работы. Мое задание состоит в том, чтобы получить код для компиляции с подробным описанием всех хаков, которые я делаю, чтобы потом мы могли просмотреть эти хаки и найти надлежащие способы их устранения.

Ответы [ 2 ]

2 голосов
/ 26 января 2011

Если вы делаете много звонков на pow(int, unsigned int), почему бы вам не написать это самостоятельно?Если скорость выполнения не является проблемой, это не слишком большая работа.

В противном случае я бы использовал перегрузку pow(), входные параметры которой гарантированно содержат ожидаемые значения, например pow(float, float) или pow(double, double),В любом случае, я чувствую, что создание собственной версии может предотвратить проблемы с преобразованием между плавающей точкой и целым числом.

1 голос
/ 26 января 2011

Результат всегда будет целочисленным, с этими типами аргументов.

В зависимости от ожидаемого диапазона аргументов, особенно показателя степени, вы должны выбрать версию float или double или long double.

Так что бы стало

pow( (float) i, (int)ui );

Допустимый диапазон аргументов можно найти, решив уравнение pow (i, ui)

...