【发布时间】:2021-03-25 22:39:21
【问题描述】:
我有以下非常粗略的积分计算器:
// definite integrate on one variable
// using basic trapezoid approach
float integrate(float start, float end, float step, float (*func)(float x))
{
if (start >= (end-step))
return 0;
else {
float x = start; // make it a bit more math-like
float segment = step * (func(x) + func(x+step))/2;
return segment + integrate(x+step, end, step, func);
}
}
还有一个用法示例:
static float square(float x) {return x*x;}
int main(void)
{
// Integral x^2 from 0->2 should be ~ 2.6
float start=0.0, end=2.0, step=0.01;
float answer = integrate(start, end, step, square);
printf("The integral from %.2f to %.2f for X^2 = %.2f\n", start, end, answer );
}
$ run
The integral from 0.00 to 2.00 for X^2 = 2.67
如果start >= (end-step) 的相等检查不起作用会怎样?例如,如果它评估某物为 2.99997 而不是 3,那么另一个循环(或少一个循环)也是如此。有没有办法防止这种情况发生,或者大多数数学类型的计算器只能使用小数或“正常”浮点数的扩展?
【问题讨论】:
-
让我们首先问一下为什么要对这样的事情使用递归。
-
@MadPhysicist 实际上的全部意义在于练习递归。我只是在寻找一些我可以写的东西来帮助处理递归,因为这是我在努力解决的问题。
-
如果你想练习递归,那么更好的积分方法可能是将区间分成两半并递归调用例程来积分每一半。终止条件可能是间隔小于某个阈值或执行了一定数量的划分时。它实际上与计算机的工作量大致相同,但调用树的深度为 O(log n) 而不是 O(n),其中 n 是子区间的总数。
-
@EricPostpischil 这是个好主意,我想接下来我会试试这个!
-
无论哪种方式,都有堆栈溢出的风险。这对于一般的递归来说不是一个好问题。
标签: c math floating-point decimal