Как Вы делаете возведение в степень в C?

Используйте sp_executesql для выполнения любого SQL, например

DECLARE @tbl    sysname,
        @sql    nvarchar(4000),
        @params nvarchar(4000),
        @count  int

DECLARE tblcur CURSOR STATIC LOCAL FOR
   SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated'
   ORDER  BY 1
OPEN tblcur

WHILE 1 = 1
BEGIN
   FETCH tblcur INTO @tbl
   IF @@fetch_status <> 0
      BREAK

   SELECT @sql =
   N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) +
   N' WHERE LastUpdated BETWEEN @fromdate AND ' +
   N'                           coalesce(@todate, ''99991231'')'
   SELECT @params = N'@fromdate datetime, ' +
                    N'@todate   datetime = NULL, ' +
                    N'@cnt      int      OUTPUT'
   EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT

   PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.'
END

DEALLOCATE tblcur
51
задан raldi 17 October 2008 в 17:24
поделиться

5 ответов

используйте pow функция (она берет float с / double с хотя).

man pow:

   #include <math.h>

   double pow(double x, double y);
   float powf(float x, float y);
   long double powl(long double x, long double y);

РЕДАКТИРОВАНИЕ: BTW, для особого случая положительных целочисленных полномочий 2, можно использовать разрядное смещение: (1 << x) будет равняться 2 питанию x. Существуют некоторые потенциальные глюки с этим, но обычно это было бы корректно.

88
ответ дан Evan Teran 7 November 2019 в 19:46
поделиться

Добавить к какой сказанный Evan: C не имеет встроенного оператора для возведения в степень, потому что это не примитивная операция для большинства центральных процессоров. Таким образом это реализовано как библиотечная функция.

кроме того, для вычисления функционального e^x, можно использовать exp(double), expf(float), и expl(long double) функции.

Примечание, которое Вы делаете не , хочет использовать ^ оператор, который является битовое исключающее "ИЛИ" оператор.

33
ответ дан Community 7 November 2019 в 19:46
поделиться

Нерекурсивная версия функции не слишком трудна - здесь это для целых чисел:

long powi(long x, unsigned n)
{
    long p = x;
    long r = 1;

    while (n > 0)
    {
        if (n % 2 == 1)
            r *= p;
        p *= p;
        n /= 2;
    }

    return(r);
}

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

4
ответ дан Jonathan Leffler 7 November 2019 в 19:46
поделиться

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

Обычно немой путь достаточно хорош.

int power(int base, unsigned int exp) {
    int i, result = 1;
    for (i = 0; i < exp; i++)
        result *= base;
    return result;
 }

Вот рекурсивное решение, которое берет O(log n) пространство и время вместо легкого O(1) пространство O(n) время:

int power(int base, int exp) {
    if (exp == 0)
        return 1;
    else if (exp % 2)
        return base * power(base, exp - 1);
    else {
        int temp = power(base, exp / 2);
        return temp * temp;
    }
}
23
ответ дан ephemient 7 November 2019 в 19:46
поделиться

или Вы могли просто записать функцию питания с рекурсией как добавленная премия

int power(int x, int y){
      if(y == 0)
        return 1;
     return (x * power(x,y-1) );
    }

да, да я знаю, что это - менее эффективная сложность пространства и времени, но рекурсия является просто большим количеством забавы!!

1
ответ дан None 7 November 2019 в 19:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: