c语言 - 比较 2 个双精度数字与可接受的错误 - 始终显示"not equal"



问:如何检查两个浮点数是否相等?

:你可以做这样的事情:

#define EPSILON 0.00000001
int compare(double num1, double num2, double error)
{
    if(fabs(num1 - num2) < EPSILON)
        return 1;
    else
        return 0;
}

问:如何检查两个浮点数是否相等,并出现一些可接受的误差?意思是,我有两个数字,a = 9.2b = 9.7。当我设定error = 0.7时,我可以认为ab平等。(对于a = 9.2b = 9.9也是如此,但对于a = 9.2b = 10.0,当error 0.7时,它也是错误的)。

答:我试过这个,但每次(无论error看起来如何),它总是显示0

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define EPSILON 0.00000001
static int compare(double num1, double num2, double error)
{
    if((fabs(num1 - num2) < EPSILON - error) || (fabs(num1 - num2 + error) < EPSILON + error))
        return 1;
    else
        return 0;
}
static int areEqual(const double *x, int size, double error)
{
    int i;
    for (i = 0; i < size - 1; i++)
        if (!compare(x[i], x[i + 1], error))
            return 0;
    return 1;
}
int main(int argc, char **argv)
{
    double tab[] = {9.2, 9.7, 9.3, 9.6, 9.4, 10.0, 9.1, 9.7};
    double error = 0.9;
    const int N = 10;
    printf("%dn", areEqual(tab, N, error));

    return 0;
}

尝试也这样做:

static int compare2(double num1, double num2, double error)
{
    if(fabs(num1 - num2) <= error)
        return 1;
    else
        return 0;
}

0也显示出来。

编辑:

终于,做到了!工作代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#define EPSILON 0.00000001
static void checkFabs()
{
    printf("%dn", fabs(-0.7) < 1.0);
    printf("%dn", fabs(-0.75) < 1.0);
    printf("%dn", fabs(-0.71) < 1.0);
    printf("%dn", fabs(0.5) < 0.9);
    printf("%dn", fabs(0.6) < 0.9);
    printf("%dn", fabs(0.3) < 0.9);
    printf("%dn", fabs(0.2) < 0.9);
    printf("%dn", fabs(0.8) < 0.9);
    printf("%dn", fabs(0.1) < 0.9);
    printf("%dn", fabs(0.9) <= 0.9);
}
static int compare(double num1, double num2, double error)
{
    if(fabs(num1-num2) <= error + EPSILON)
        return 1;
    else
        return 0;
}
static int areEqual(const double *x, int size, double error)
{
    int i;
    for (i = 0; i < size - 1; i++)
        if (!compare(x[i], x[i + 1], error))
            return 0;
    return 1;
}
int main(int argc, char **argv)
{
    double tab[] = {9.2, 9.7, 9.3, 9.6, 9.4, 9.9, 9.1, 9.7};
    double error = 0.9;
    const int N = 8;
    printf("%dn", areEqual(tab, N, error));
    return 0;
}

数组中有 8 个元素,而不是 10 个。这是您需要的比较功能:

static int compare(double num1, double num2, double error)
{
    if(fabs(num1 - num2) < error + EPSILON)
        return 1;
    else
        return 0;
}
代码

中的EPSILON - error是负数!

只需将其与error进行比较即可。

不定义 epsilon 并使用 float.h 标头中定义的DBL_EPSILON进行比较。

您错过了错误。

它实际上用 0 减去最后一个值。 所以它的相对误差。

结帐大小。

相关内容

  • 没有找到相关文章

最新更新