Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您将如何在C中实现pow(a,b)?情况如下--_C - Fatal编程技术网

您将如何在C中实现pow(a,b)?情况如下--

您将如何在C中实现pow(a,b)?情况如下--,c,C,不使用乘法或除法运算符。 只能使用添加/减除运算符 如果它们是整数,很容易将pow a,b转化为a的b乘法 pow(a, b) = a * a * a * a ... ; // do this b times 把a*a变成加法也很简单 a * a = a + a + a + a + ... ; // do this a times 如果你把它们结合起来,你就可以成为战俘 首先,生成multi-nt a,int-b,然后使用它生成pow。递归解决方案: #include<stdio.h&

不使用乘法或除法运算符。
只能使用添加/减除运算符

如果它们是整数,很容易将pow a,b转化为a的b乘法

pow(a, b) = a * a * a * a ... ; // do this b times
把a*a变成加法也很简单

a * a = a + a + a + a + ... ; // do this a times
如果你把它们结合起来,你就可以成为战俘

首先,生成multi-nt a,int-b,然后使用它生成pow。

递归解决方案:

#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));
    }

一个无意义的问题,但可以用对数的性质来解决:

pow(a,b) = exp( b * log(a) )
         = exp( exp(log(b) + log(log(a)) )
注意确保指数函数和对数函数使用相同的基数


是的,我知道如何使用幻灯片。学习这个技巧将改变你对对数的看法。

你已经得到了纯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、-或AND-NOT等。上面所示的实现非常适合,如果您想获得技术,加法器需要几个门,但VHDL、Verilog等。,但它还是包含在VHDL和Verilog中。

什么,没有比较运算符?赋值运算符呢?可以使用该运算符吗?在不使用乘法或除法运算符的情况下,如何在C中实现powa,b?我不会。这是作业吗?那循环呢?或者我们必须使用递归进行循环?对于大指数,这将非常失败:这不是expb*loga吗?考虑到powa,b通常意味着a被提升到b的幂,而不是相反。