没有幂函数的浮点乘幂

ymi*_*ere 9 math

目前,我必须在电源操作员被窃听的环境中工作.任何人都可以想到一种方法暂时解决这个bug并计算一个没有幂函数或运算符的^ b(两个浮点)?

Tom*_*das 24

如果你有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 ); }
Run Code Online (Sandbox Code Playgroud)

测试代码:

void main()
{
   cout.precision( 12 );
   cout << mypow( 2.7, 1.23456 ) << endl;
   cout << pow  ( 2.7, 1.23456 ) << endl;
   cout << mypow( 1.001, 1000.7 ) << endl;
   cout << pow  ( 1.001, 1000.7 ) << endl;
   cout << mypow( .3, -10.7 ) << endl;
   cout << pow  ( .3, -10.7 ) << endl;
   cout << mypow( 100000, .00001 ) << endl;
   cout << pow  ( 100000, .00001 ) << endl;
   cout << mypow( 100000, .0000001 ) << endl;
   cout << pow  ( 100000, .0000001 ) << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

3.40835049344
3.40835206431
2.71882549461
2.71882549383
393371.348073
393371.212573
1.00011529225
1.00011513588
1.00000548981
1.00000115129
Run Code Online (Sandbox Code Playgroud)

  • 当然,基本思想是x ^ .5 = sqrt(x),x ^ .25 = sqrt(sqrt(x)),x ^ .125 = sqrt(sqrt(sqrt(x)))等.这些构建块,我们可以说x ^ .625 =(x ^ .5)*(x ^ .125).我们不能完全表达x ^ .3,但我们可以任意接近.我的实现方式略有不同,但它使用相同的概念. (6认同)
  • +1; 顺便说一下,它是`int main()`而不是`void main` :-) (2认同)

Jim*_*wis 9

您可以使用标识a b = e (b log a),然后所有计算都相对于相同的基数e = 2.71828 ...

现在你必须实现f(x)= ln(x),并且g(x)= e ^ x.快速,低精度的方法是使用f(x)和g(x)的查找表.也许这对你的目的来说足够好了.如果不是,您可以使用泰勒级数展开来表示乘法和加法方面的ln(x)和e ^ x.