c的功耗计算,编译器优化

c的功耗计算,编译器优化,c,optimization,numerical,stability,C,Optimization,Numerical,Stability,所以我最近一直在研究顺序统计的概率分布。在这一领域,很常见的情况是,许多公式具有实数区间[0,1]的高次幂 考虑数字a~b~0,两者都是正数。我想计算一些类似于a^n/b^m的值 其中n,m是巨大的数字 我的问题如下: 如果我使用C代码,比如 double f(double a, double b, long m, long n) { return( pow(a, n) / pow(b, m) ); } 这会稳定吗?规则应该是首先计算a^n,然后计算b^m,然后除以,但是如果 a^n或

所以我最近一直在研究顺序统计的概率分布。在这一领域,很常见的情况是,许多公式具有实数区间[0,1]的高次幂

考虑数字a~b~0,两者都是正数。我想计算一些类似于a^n/b^m的值 其中n,m是巨大的数字

我的问题如下: 如果我使用C代码,比如

double f(double a, double b, long m, long n)
{
    return( pow(a, n) / pow(b, m) );
}
这会稳定吗?规则应该是首先计算a^n,然后计算b^m,然后除以,但是如果 a^n或b^m足够小,只能是零或NaN。相反,我可以这样做

double g(double a, double b, long m, long n)
{
    double res;
    long i;
    res = 1;
    for (i = 0; i < min(m, n); ++i)
    {
        res = res * a / b;
    }
    if ( n > m )
    {
        res = res * pow(a, n - m);
    } else {
       res = res / pow(b, m - n);
    }
    return( res );
}
您知道在这种情况下1是否需要优化吗?如果不是,如何处理这种情况以实现快速稳定的评估?

如果你问pow是否通过重复乘法实现指数运算,答案是否定的。你可以假设它是优化的,因此通过检查零分子可能实现的任何节约都可以忽略不计。您肯定不想用一个for循环来实现这一点,该循环迭代了大量的浮点计算

另一方面,最好避免被零除

我会像这样实现您的功能:

double f(double a, double b, long m, long n) {
  if (b == 0) {
    // return error or infinity.
  }
  if (m >= n)
    return pow(a / b, n) * pow(a, m - n);
  else 
    return pow(a / b, m) / pow(b, n - m);
  }
}

为了避免这种情况,在日志域中进行计算是否可行?i、 e.结果=expn*loga-m*logb。免责声明:我绝对不是数字专家。你想要第二种形式。但不要使用for循环。使用powa/b、minm、n减少操作数。假设m和n一定是非负的,谢谢!我想使用sum和loga logb组合这两种方法没有问题:在a~b~0中,~应该表示近似相等吗?让其他方法返回powa/b,m*powb,m-n会稍微好一点吗;?大概我不知道用现代浮点处理器。这就是剖析器的用途:-