Math 无幂函数的浮点求幂

Math 无幂函数的浮点求幂,math,Math,目前,我必须在电力运营商被窃听的环境中工作。有没有人能想出一种方法暂时解决这个错误,在没有幂函数或运算符的情况下计算a^b(都是浮点值)?你可以使用标识ab=e(b log a),那么所有的计算都是相对于相同的基数e=2.71828 现在必须实现f(x)=ln(x)和g(x)=e^x。快速、低精度的方法是使用f(x)和g(x)的查找表。也许这对你来说已经足够好了。如果不是,您可以使用来表示ln(x)和e^x 关于乘法和加法。如果您有sqrt()可用: double sqr( double x )

目前,我必须在电力运营商被窃听的环境中工作。有没有人能想出一种方法暂时解决这个错误,在没有幂函数或运算符的情况下计算a^b(都是浮点值)?

你可以使用标识ab=e(b log a),那么所有的计算都是相对于相同的基数e=2.71828

现在必须实现f(x)=ln(x)和g(x)=e^x。快速、低精度的方法是使用f(x)和g(x)的查找表。也许这对你来说已经足够好了。如果不是,您可以使用来表示ln(x)和e^x 关于乘法和加法。

如果您有sqrt()可用:

double sqr( double x ) { return x * x; }
// meaning of 'precision': the returned answer should be base^x, where
//                         x is in [power-precision/2,power+precision/2]
double mypow( double base, double power, double precision )
{   
   if ( power < 0 ) return 1 / mypow( base, -power, precision );
   if ( power >= 10 ) return sqr( mypow( base, power/2, precision/2 ) );
   if ( power >= 1 ) return base * mypow( base, power-1, precision );
   if ( precision >= 1 ) return sqrt( base );
   return sqrt( mypow( base, power*2, precision*2 ) );
}
double mypow( double base, double power ) { return mypow( base, power, .000001 ); }

考虑到您可以使用sqrt,这个简单的递归算法可以工作:

假设我们在计算aˆb。该算法的工作方式是对指数进行快速求幂,直到我们到达分数部分,一旦进入分数部分,进行修改的二进制搜索,直到我们足够接近分数部分

double EPS = 0.0001;

double exponentiation(double base, double exp){
  if(exp >= 1){
    double temp = exponentiation(base, exp / 2);
    return temp * temp;
  } else{
    double low = 0;
    double high = 1.0;

    double sqr = sqrt(base);
    double acc = sqr;    
    double mid = high / 2;

    while(abs(mid - exp) > EPS){
      sqr = sqrt(sqr);

      if (mid <= exp) {
          low = mid;
          acc *= sqr;
      } else{
          high = mid;
          acc *= (1/sqr);
      }

      mid = (low + high) / 2;
    }

    return acc;
  }
}
double-EPS=0.0001;
双指数运算(双基,双经验){
如果(exp>=1){
双温=指数运算(基数,exp/2);
返回温度*温度;
}否则{
双低=0;
双高=1.0;
双sqr=sqrt(基准);
双acc=sqr;
双中=高/2;
而(abs(中期经验)>每股收益){
sqr=sqrt(sqr);

if(mid)‘b’总是整数吗?如果是,从1开始,乘以a,b timesa和b都是浮点数,不是自然数你有sqrt()吗可用?我有一个可用的ln函数。但是,对于泰勒级数,我再次需要幂。@ymihere:泰勒级数展开式只包含整数指数,可以将其减少为乘法。@ymihere:有exp()吗有吗?如果有,这个解决方案是最好的!@tom:我没有经验。事实上,这正是我正在研究的。非常感谢。这正是我想要的。出于兴趣:你能告诉我这个算法的背景吗?当然,基本思想是x^.5=sqrt(x),x^.25=sqrt(sqrt(x)),x^.125=sqrt(sqrt(sqrt(x)))使用这些构建块,我们可以说x^.625=(x^.5)*(x^.125).我们不能精确地表达,比如说,x^.3,但我们可以任意接近。我的实现有点不同,但它使用了相同的概念。请注意,如果您的sqrt函数具有与std::sqrt相同的限制,那么这将不适用于负基。我喜欢您的想法,但我想它可以在时间和空间上以更高的复杂性完成。迭代版本最多可以节省O(1)的空间,时间最多可以提高O(log(n))。顺便说一句,您可以实现sqrt,如中所示。
3.40835049344
3.40835206431
2.71882549461
2.71882549383
393371.348073
393371.212573
1.00011529225
1.00011513588
1.00000548981
1.00000115129
double EPS = 0.0001;

double exponentiation(double base, double exp){
  if(exp >= 1){
    double temp = exponentiation(base, exp / 2);
    return temp * temp;
  } else{
    double low = 0;
    double high = 1.0;

    double sqr = sqrt(base);
    double acc = sqr;    
    double mid = high / 2;

    while(abs(mid - exp) > EPS){
      sqr = sqrt(sqr);

      if (mid <= exp) {
          low = mid;
          acc *= sqr;
      } else{
          high = mid;
          acc *= (1/sqr);
      }

      mid = (low + high) / 2;
    }

    return acc;
  }
}