2015-01-10 2 views
0

Я пытаюсь создать вспомогательную функцию для десятичного в двоичный конвертер, который покажет мне, какой бит, чтобы начать на основе на самой высокой мощности 2.пау функция C++ ошибка

Это код, у меня есть:

int determineStart(int val){ 
    int topval = 1; 
    int i = 0; 
    for(i = 0; val > 2 * topval; ++i){ 
     topval = pow(2, i); 
    } 
    return topval; 
} 

Я получаю следующее сообщение об ошибке: main.cpp:9: error: call of overloaded pow(int, int&) is ambiguous

Я попытался переключения несколько вещей вокруг (например, положить в отдельную переменную double или как второй парам для pow(), что делает topval a double и т. Д.), Но он не мог заставить его работать.

Что я делаю неправильно?

+0

Существуют ли другие 'pow' определения в программе? Пожалуйста, опубликуйте полную программу – bluefog

ответ

2

Самый простой (и самый быстрый) способ получить полномочия двух смещается - процессор все равно использует двоичный файл, поэтому он может просто добавить несколько дополнительных нулей в конце для вас.

Итак, вместо pow(2, i) вы бы указали (1 << i).

1

Нет функции pow() для таких типов аргументов. Это может быть (float, int), (double, int) или (long double, int). Если вы вызываете его с помощью (int, int), компилятор не знает, какой из перечисленных типов использует. Самым простым решением было бы сделать:

pow(2.0, i) 

EDIT: Я предполагаю, что вы используете стандартный pow() определение из <cmath> или <math.h>

+0

и как вы объясните [это] (http://ideone.com/ndcIrY) – bluefog

+0

Я использую Visual Studio 2010, и я получаю ошибку: неоднозначный вызов перегруженной функции. – Avert

+1

@ShikharBhardwaj В C++ 11 добавлено больше перегрузок. –

1

Кастинг, вероятно, является вашей ошибкой: вы можете легко отличить int, чтобы удвоить или поплавать. попробовать это:

pow(2.0, i) 

он будет вести себя, как:

pow((double)(2), i)