问:如何检查两个浮点数是否相等?
答:你可以做这样的事情:
#define EPSILON 0.00000001
int compare(double num1, double num2, double error)
{
if(fabs(num1 - num2) < EPSILON)
return 1;
else
return 0;
}
问:如何检查两个浮点数是否相等,并出现一些可接受的误差?意思是,我有两个数字,a = 9.2
和b = 9.7
。当我设定error = 0.7
时,我可以认为a
和b
平等。(对于a = 9.2
和b = 9.9
也是如此,但对于a = 9.2
和b = 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 减去最后一个值。 所以它的相对误差。
结帐大小。