c ++或c pow给出了错误的结果

时间:2012-03-20 06:11:25

标签: c++ math

我正在努力制作自己的战队,但我的结果却是错误的

我得到:2 ^ 3.3 = 16,这是错误的......为什么?

#include <iostream>

using namespace std;

double new_pow(double base, double power){

double result = 1;

for(int i = 0; i <= power; i++) {
    result *= base;
}


    return result;
}



int main (int argc, char * const argv[]) {

    std::cout << new_pow(2,3.3) << endl;
    return 0;
}

请帮我找到错误

5 个答案:

答案 0 :(得分:5)

错误是你的循环运行4次,因为4次迭代不会超过3.3次。这就是浮点指数用对数实现的原因,而不是重复乘法。

答案 1 :(得分:3)

Ignacio的答案已经提到使用对数。但我们最终还是使用了exp(),这又是一个库函数。因此,如果您根本不想使用库函数,那么您必须使用x^y x^y

之类的内容。

正如伊格纳西奥所提到的那样,直接评估泰勒对base^power = exp( power*ln(base) )的扩张是乏味的,e^x。而Taylor's expansion非常简单,taylor's expansion for e^x也非常简单。它们都可以在C

中实现简单的交互/递归实现

以下是使用上述Taylor扩展的double pow_x ( double x , unsigned i ) { double prod=1; if ( i == 0 ) return 1; while ( i ) { prod*=x; i--; } return prod; } long long factorial ( unsigned n ) { if ( n == 0 ) return 1; return n * factorial (n-1); } double expo ( double x, int terms ) { /* terms tells us how long should we expand the taylor's series */ double sum=0; unsigned i=0; while ( i< terms ) { sum+= pow_x(x,i)/factorial(i); i++; } return sum; } 的简单实现

exp(5.93,20)

376.152869ln(x)提供{{1}}

我希望,使用此示例,您可以自行实现{{1}}。

答案 2 :(得分:0)

因为您将i递增1.所以在4.0之后,它将直接递增到5.0,从而使循环的条件检查为false,从而终止循环

此外,循环变量的起始值为0,因此您应该像这样检查 -

for(double i=0; i<power; i++)

您可以查看this答案,了解如何实现浮点运算和here以实现相当高级别的实现。

答案 3 :(得分:0)

for(int i = 0; i <= power; i++)

应该是

for(int i = 1; i <= power; i++)

否则,它将再运行一次。

如Ignacio Vazquez-Abram的回答所述。 假设您想要功率y = x ^ b。 这相当于ln(y)= b * ln(x)。

所以y = exp(b*ln(x))

y = Math.e(b*Math.Log(x)) //Java

答案 4 :(得分:0)

通过将power视为int来循环。循环将运行4次并返回2^4 = 16

How to approximate decimal exponents using logarithms