IT이야기

C에서 지수를 어떻게 하느냐?

cyworld 2022. 5. 13. 23:52
반응형

C에서 지수를 어떻게 하느냐?

나는 "x = y ** e"를 써보았지만, 그것은 효과가 없었다.

를 이용하다pow기능(필요하다)floats/doubles.s.

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

편집: 양의 정수 검정력의 특별한 경우2비트 시프트 사용 가능:(1 << x)같을 것이다2전력을 다하여x이것과 관련된 몇몇 잠재적인 문제들이 있지만, 일반적으로, 그것은 정확할 것이다.

Evan의 말에 덧붙이자면, C는 대부분의 CPU에 대한 원시적인 작업이 아니기 때문에 지수를 위한 기본 연산자가 없다.그래서 도서관 기능으로 구현된다.

또한 e^x 함수를 계산하기 위해, 당신은 를 사용할 수 있다.exp(double),expf(float)그리고expl(long double)기능들

다음 구성 요소를 사용하지 않으려는 경우^연산자, 비트 와이즈 배타적 OR 연산자.

pow부동 소수점에서만 작동(doubles, 실제로).정수(integer)의 힘을 얻고자 할 때, 기초가 그 지수의 지수로 알려져 있지 않은 경우.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;
    }
}

함수의 비반복적 버전은 그리 어렵지 않다. 여기 정수를 위한 것이다.

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

(예를 들어, 이중 값을 정수 전력으로 올리기 위해 코드가 부족함 - 왕복선을 처리하기 위해 코드를 제거해야 함)

아니면 파워 함수를 쓰거나 재귀가 보너스로 추가되는 경우

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

그래, 그래, 난 이것이 덜 효율적인 공간과 시간 복잡하다는 것을 알아. 하지만 재귀가 더 재미있을 뿐이야!!

이전의 대답과 비슷하게, 이것은 이중의 양수와 음의 정수 파워를 훌륭하게 다룰 것이다.

double intpow(double a, int b)
{
  double r = 1.0;
  if (b < 0)
  {
    a = 1.0 / a;
    b = -b;
  }
  while (b)
  {
    if (b & 1)
      r *= a;
    a *= a;
    b >>= 1;
  }
  return r;
}
int power(int x,int y){
 int r=1;
 do{
  r*=r;
  if(y%2)
   r*=x;
 }while(y>>=1);
 return r;
};

(반복)

int power(int x,int y){
 return y?(y%2?x:1)*power(x*x,y>>1):1;
};

(재귀적이어야 하는 경우)

imo, 알고리즘은 반드시 O(logn)여야 한다.

참조URL: https://stackoverflow.com/questions/213042/how-do-you-do-exponentiation-in-c

반응형