C++ exp函数使用c++;
我不明白为什么我总是从C++ exp函数使用c++;,c++,function,exp,C++,Function,Exp,我不明白为什么我总是从my_exp()中得到结果1。代码如下: double factorial(const int k) { int prod = 1; for(int i=1; i<=k; i++) prod = i * prod; return prod; } double power(const double base, const int exponent) { double result = 1; for(int i=1
my_exp()
中得到结果1。代码如下:
double factorial(const int k)
{
int prod = 1;
for(int i=1; i<=k; i++)
prod = i * prod;
return prod;
}
double power(const double base, const int exponent)
{
double result = 1;
for(int i=1; i<=exponent; i++)
result = result * base;
return result;
}
double my_exp(double x)
{
double sum = 1 + x;
for(int k=2; k<50; k++)
sum = sum + power(x,k) / factorial(k);
return sum;
}
双阶乘(常数int k)
{
int prod=1;
对于(int i=1;i您的阶乘
函数中有一个整数溢出。这会导致它输出零。49!
可被2^32
整除,因此阶乘
函数将返回零
然后除以它,使其变为无穷大。因此解决方案是将prod
更改为double
:
double prod = 1;
不要完全评估你的扩展中的每个术语的幂和阶乘项,你应该考虑第k个术语是如何与K-1TH相关的,并且仅仅基于这个关系来更新每一个术语。这将避免你的幂和阶乘函数中的严重溢出(例如,你将不再需要)。
双倍我的经验(双倍x)
{
双和=1.0+x;
双项=x;//k=1的项就是x
对于(int k=2;k<50;k++)
{
术语=术语*x/(双)k;//术语[k]=术语[k-1]*x/k
总和=总和+期限;
}
回报金额;
}
您只需将k表单50的最大值减少到30左右即可
还有一个问题是,您的代码在0附近工作?提供一个自包含的代码段来演示您的问题。x
的值为1。#INF
?请尝试使用长双变量类型,而不是双变量类型。指数函数很可能会出现堆栈溢出,如@mystic said。请问函数是什么关于我的_exp();正在尝试做什么?也许这会帮助我制作另一段代码供您使用。
double my_exp(double x)
{
double sum = 1.0 + x;
double term = x; // term for k = 1 is just x
for (int k = 2; k < 50; k++)
{
term = term * x / (double)k; // term[k] = term[k-1] * x / k
sum = sum + term;
}
return sum;
}