Как вы будете реализовывать pow (a, b) в C?условие следует - - PullRequest
0 голосов
/ 13 февраля 2011

без использования операторов умножения или деления. Вы можете использовать только операторы add / substract.

Ответы [ 4 ]

9 голосов
/ 13 февраля 2011

Бессмысленная задача, но разрешимая со свойствами логарифмов:

pow(a,b) = exp( b * log(a) )
         = exp( exp(log(b) + log(log(a)) )

Убедитесь, что ваши экспоненциальные и логарифмические функции используют одну и ту же базу.


Да, я знаю, как пользоваться слайдером. Изучение этого трюка изменит вашу точку зрения на логарифмы.

4 голосов
/ 13 февраля 2011

Если они целые числа, просто превратить pow (a, b) в b, умноженные на a.

pow(a, b) = a * a * a * a ... ; // do this b times

И просто превратить * в дополнения

a * a = a + a + a + a + ... ; // do this a times

Если вы объедините их, вы можете сделать Pow.

Сначала сделайте mult (int a, int b), затем используйте его для создания pow.

2 голосов
/ 13 февраля 2011

Рекурсивное решение:

#include<stdio.h>




    int multiplication(int a1, int b1)
    {
       if(b1)
         return (a1 + multiplication(a1, b1-1));
       else
         return 0;
    }

   int pow(int a, int b)
    {

       if(b)
         return multiplication(a, pow(a, b-1));
       else
         return 1;
    }    


    int main()
    {
      printf("\n %d", pow(5, 4));
    }
0 голосов
/ 13 февраля 2011

Вы уже получили ответы исключительно для FP и исключительно для целых чисел.Вот один для числа FP, возведенного в целую степень:

double power(double x, int y) { 
    double z = 1.0;

    while (y > 0) {
        while (!(y&1)) {
            y >>= 2;
            x *= x;
        }
        --y;
        z = x * z;
    }
    return z;
}

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

int mul(int x, int y) { 
    int result = 0;
    while (y) { 
        if (y&1)
            result += x;
        x <<= 1;
        y >>= 1;
    }
    return result;
}

С плавающей точкой почти то же самое, за исключением того, что вы должны нормализовать свои результаты - т.е., по сути, число с плавающей запятой равно 1) значению и выражается как(обычно довольно большое) целое число и 2) коэффициент масштабирования.Если вы хотите получить нормальные числа с плавающей запятой IEEE, некоторые части становятся немного уродливыми - например, масштабный коэффициент сохраняется как число смещения вместо любого обычного дополнения 1, дополнения 2 и т. Д., Поэтомуработать с ним неуклюже (в основном, каждую операцию, которую вы вычитаете из смещения, выполняете операцию, проверяете на переполнение и (при условии, что она не переполнена) снова добавляете смещение).

Выполнение работыбез каких-либо логических тестов звучит (для меня), как будто это не было на самом деле предназначено.Для довольно многих классов компьютерной архитектуры интересно свести проблему к примитивным операциям, которые вы можете выразить непосредственно в аппаратном обеспечении (например, сдвиги битов, поразрядно - AND, - OR и - NOT и т. Д.). Реализацияпоказанный выше пример вполне подходит (если вы хотите получить техническую информацию, сумматор занимает несколько ворот, но VHDL, Verilog и т. д., но в любом случае он включен в такие вещи, как VHDL и Verilog).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...