if(数学函数)中的误差范围

时间:2015-03-23 17:12:17

标签: c console-application

这是我的代码:

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)了,但我最终得到了这个:

enter image description here

如何使我的范围正常工作?这是一个愚蠢的问题:)

4 个答案:

答案 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中)