如何在不使用 java 的 math.pow 的情况下获得指数

Posted

技术标签:

【中文标题】如何在不使用 java 的 math.pow 的情况下获得指数【英文标题】:how to get exponents without using the math.pow for java 【发布时间】:2014-04-19 16:44:23 【问题描述】:

这是我的程序

// ************************************************************
    // PowersOf2.java
    //
    // Print out as many powers of 2 as the user requests
    //
    // ************************************************************

    import java.util.Scanner;

    public class PowersOf2 

    public static void main(String[] args)

    
        int numPowersOf2; //How many powers of 2 to compute
        int nextPowerOf2 = 1; //Current power of 2
        int exponent= 1;
        double x;

         //Exponent for current power of 2 -- this
        //also serves as a counter for the loop Scanner

        Scanner scan = new Scanner(System.in);
        System.out.println("How many powers of 2 would you like printed?");
        numPowersOf2 = scan.nextInt();
        System.out.println ("There will be " + numPowersOf2 + " powers of 2 printed");
        //initialize exponent -- the first thing printed is 2 to the what?

    while( exponent <= numPowersOf2)
        
        double x1 = Math.pow(2, exponent);
        System.out.println("2^" + exponent + " = " + x1);
                exponent++;
           
//print out current power of 2
//find next power of 2 -- how do you get this from the last one?
//increment exponent

    

问题是我不允许使用 math.pow 方法,我需要在 while 循环中找到另一种方法来获得正确答案。

【问题讨论】:

乘以可能?!?毕竟next power = previous power * 2..eg 2^1=2 2^2 = 4, 2^3 = 4*2 = 8 一定要保存电源是否为负。如果是这样,除而不是乘。 获取您使用的指数log,而不是powpow 用于获取权限 【参考方案1】:

2 的幂可以通过 Bit Shift Operators 简单计算

int exponent = ...
int powerOf2 = 1 << exponent;

即使是更一般的形式,您也应该通过“乘以 n 次”来计算指数。相反,你可以这样做Exponentiation by squaring

【讨论】:

【参考方案2】:

这是一个允许负/正功率计算的帖子。

https://***.com/a/23003962/3538289

处理具有 O(log(n)) 复杂度的 +/- 指数的函数。

double power(double x, int n)
 if(n==0)
  return 1;

  if(n<0)
      x = 1.0/x;
      n = -n;
  
 double ret = power(x,n/2);
 ret = ret * ret;
 if(n%2!=0)
   ret = ret * x;
 return ret;

【讨论】:

【参考方案3】:

您可以实现自己的power 函数。

power 函数的复杂性取决于您的要求和约束。 例如,您可以将指数限制为仅是正整数。

这是power函数的示例:

public static double power(double base, int exponent) 
    double ans = 1;
    if (exponent != 0) 
        int absExponent = exponent > 0 ? exponent : (-1) * exponent;
        for (int i = 1; i <= absExponent; i++) 
            ans *= base;
        

        if (exponent < 0) 
            // For negative exponent, must invert
            ans = 1.0 / ans;
        
     else 
        // exponent is 0
        ans = 1;
    

    return ans;

【讨论】:

【参考方案4】:

如果没有性能限制,您可以这样做:

double x1=1;

for(int i=1;i<=numPowersOf2;i++)
   x1 =* 2

【讨论】:

这个有性能限制。将是O(n)。可以在O(1)时间完成。【参考方案5】:

你可以尝试根据这个explanation来做这个:

 public double myPow(double x, int n) 

    if(n < 0) 
        if(n == Integer.MIN_VALUE) 
            n = (n+1)*(-1);
            return 1.0/(myPow(x*x, n));
        
        n = n*(-1);
        return (double)1.0/myPow(x, n);
    
    double y = 1;
    while(n > 0) 
        if(n%2 == 0) 
           x = x*x; 
        
        else 
            y = y*x;
            x = x*x;
        
         n = n/2;
    
    return y;   

【讨论】:

【参考方案6】:

目前尚不清楚您对使用循环的评论是一种愿望还是一种要求。如果这只是一个愿望,那么您可以使用不依赖于Math.Pow 的数学身份。

x<sup>y</sup> = e<sup>y∙ln(x)</sup>

在 Java 中是这样的

public static double myPow(double x, double y)
  return Math.exp(y*Math.log(x));

如果你真的需要一个循环,你可以使用类似下面的东西

public static double myPow(double b, int e) 
  if (e < 0) 
    b = 1 / b;
    e = -e;
  

  double pow = 1.0;
  double intermediate = b;
  boolean fin = false;

  while (e != 0) 
    if (e % 2 == 0) 
      intermediate *= intermediate;
      fin = true;
     else 
      pow *= intermediate;
      intermediate = b;
      fin = false;
    
    e >>= 1;
  

  return pow * (fin ? intermediate : 1.0);

【讨论】:

【参考方案7】:
// Set the variables

int numPowersOf2;        //How many powers of 2 to compute
int nextPowerOf2 = 1;    //Current power of  2
int exponent = 0;  


/* User input here */

// Loop and print results

do
   

    System.out.println ("2^" + exponent + " = " + nextPowerOf2);

    nextPowerOf2 = nextPowerOf2*2;

    exponent ++;
   
while (exponent < numPowersOf2);

【讨论】:

【参考方案8】:

这是我不使用“myPow(x,n)”而是使用“while”的管理方式。 (我才学 Java 2 周,请原谅,如果代码有点笨拙:)

    String base ="";
    String exp ="";
    BufferedReader value = new BufferedReader (new InputStreamReader(System.in));
    try System.out.print("enter the base number: ");
        base = value.readLine();
        System.out.print("enter the exponent: ");
        exp = value.readLine(); 
    catch(IOException e)System.out.print("error");

    int x = Integer.valueOf(base);
    int n = Integer.valueOf(exp);
    int y=x;
    int m=1;       
    while(m<n+1) 
        System.out.println(x+"^"+m+"= "+y);
        y=y*x;
        m++;    
    

【讨论】:

【参考方案9】:

要在不使用内置 Math.pow() 的情况下实现 pow 函数,我们可以使用下面的递归方式来实现它。为了优化运行时,我们可以存储 power(a, b/2) 的结果并根据偶数或奇数的次数重复使用它。

static float power(float a, int b)

    float temp;
    if( b == 0)
        return 1;
    temp = power(a, b/2); 

    // if even times
    if (b%2 == 0)
        return temp*temp;
    else  // if odd times
    
        if(b > 0)
            return a * temp * temp;
        else  // if negetive i.e. 3 ^ (-2)
            return (temp * temp) / a;
    
 

【讨论】:

【参考方案10】:

我知道这个答案已经很晚了,但是如果允许您拥有存储基数和指数的变量,则可以使用一个非常简单的解决方案。

public class trythis 
    public static void main(String[] args) 
        int b = 2;
        int p = 5;
        int r = 1;
        for (int i = 1; i <= p; i++) 
            r *= b;
        
        System.out.println(r);
    

这适用于正基和负基,但不适用于负幂。

【讨论】:

【参考方案11】:

要在不使用Math.pow() 的情况下获得指数值,您可以使用循环: 只要计数小于 b (你的力量),你的循环就会有 附加“* a”。从数学上讲,它与拥有Math.pow() 相同

while (count <=b)
    a= a* a;

【讨论】:

【参考方案12】:

试试这个简单的代码:

public static int exponent(int base, int power) 
   int answer = 1;

   for(int i = 0; i < power; i++) 
      answer *= base;
   

   return answer;

【讨论】:

以上是关于如何在不使用 java 的 math.pow 的情况下获得指数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jsp 中使用 Math.pow?

舍入为整数的 Java Math.pow 多次返回相同的数字

java Math类方法使用

Math.pow用法及实现探究

C# Math.pow(x, 0.333)

无法在 NodeMCU/ESP8266 中使用 math.pow 函数