我正在努力制作自己的战队,但我的结果却是错误的
我得到: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;
}
请帮我找到错误
答案 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.152869
为ln(x)
提供{{1}}
我希望,使用此示例,您可以自行实现{{1}}。
答案 2 :(得分:0)
因为您将i
递增1.所以在4.0
之后,它将直接递增到5.0
,从而使循环的条件检查为false,从而终止循环
此外,循环变量的起始值为0
,因此您应该像这样检查 -
for(double i=0; i<power; i++)
答案 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
。