这是我的代码:
dx = (to - from) / n;
x = from - dx;
printf("\n\n X math.h szereg i abortReason\n\n");
while(x <= to) {
x += dx;
if(x > -1. && x <= 1.) {
printf("%11lf %16lf %16lf", x, log(1 + x), myFunc(x, epsilon, m, &abort));
printf(" %7d %s\n", abort, getAbortReason(abort, &m));
} else {
notInScope++;
}
}
如果条件因为我的数学函数有范围(-1&lt; x&lt; = 1)了,但我最终得到了这个:
如何使我的范围正常工作?这是一个愚蠢的问题:)
答案 0 :(得分:2)
您需要了解浮点的工作原理 - 它具有有限的分辨率,并且您的dx
值不能完全表示。
您可以从以下位置更改循环:
while(x <= to) {
x += dx;
// ...
}
为:
for (i = 0; i <= n; ++i)
{
x = from + (double)i * dx;
// ...
}
这可确保您获得正确的范围和正确的增量数,并且还可以最大限度地减少舍入误差。
答案 1 :(得分:1)
当您需要使用由浮点数定义的范围并使用浮点数的增量时,您不太可能获得精确的增量数。但是,如果使用整数来控制增量数,则可以控制它。
说你有:
double start = <some number>;
double end = <some number>;
int numIncrements = 10;
double delta = (end-start)/numIncrements;
循环:
for ( double iter = start; iter <= end; iter += delta )
{
// Do stuff
}
不如:
for ( int i = 0; i <= numIncrements; ++i )
{
double iter = start + i*delta;
// Do stuff
}
答案 2 :(得分:0)
更改while(x <= to)
---&gt;由于微妙的浮点不准确,while(x <= (to+dx/2)
为x
提供了充足的余量。
答案 3 :(得分:-2)
它开始在Visual Studio中工作(问题出在CodeBlox中)