C if语句中的双重比较未按预期工作

时间:2017-03-03 00:47:08

标签: c gcc double comparison precision

我正在编写一个程序,它将用户的输入作为整行, 然后将整数解析成一个数组,最终计算平均值和最接近平均值的值。

我正在运行Windows 10,Dev C ++ IDE和编译器TDM-GCC 4.9.2 64位

我读到双重比较是C中的一个问题所以我使用了isless()函数来获得更高的精度。 仍然由于某种原因,比较没有按预期进行。 到目前为止,这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<float.h>

int main(){

char string[250];

//Prompt user to input sequence of integers
printf("Please enter the integer values: ");

//Read whole line from input
fgets (string, 250, stdin);


//Remove non-numeric characters from sequence and replace them with ' ' (space)
int j;
for(j=0; j<strlen(string); j++)
{
    if(!isdigit(string[j]))
    string[j] = ' ';
}

char *token;
char *rest = string;
int array[50]={0};
int i=0;


//Break string into Sub-tokens with ' ' as delimiter
// and parse them into an int array
while((token = strtok_r(rest, " ", &rest)))
{
    array[i]=atoi(token);
    i++;
}


double average,counter,sum;
i=0;
counter=0;
sum=0;

//Calculate the average
while(array[i]!=0)
{
    sum=sum+array[i];
    counter++;
    i++;

}
average=sum/counter;
//printf("Counter %lf",counter);
//printf("sum %lf", sum);
printf("Average : %lf\n",average);


int index=0;
i=0;
double difference;
while(array[i]!=0)
{
    if (i==0)
    {
        difference=fabs(fabs(array[0])-fabs(average));
    }

    if(isless((fabs(array[i])-fabs(average)),difference))
    {
        index=i;
    }


    printf("index %i difference %lf \n", index, fabs(fabs(array[i])-fabs(average)));
    printf("i value %i \n",i);
    i++;
}

printf("Closest element : %i\n", array[index]);


return 0;

}

有没有其他方法来比较无效函数以外的2个值? 程序的测试运行给出以下输出: Test Output

如果在最后一个if中存在另一种比较方式,请告诉我。

1 个答案:

答案 0 :(得分:0)

我认为问题在于你的逻辑...... 每次更新索引时都需要更新最小差异。

试试这个:

if(isless((fabs(array[i])-fabs(average)),difference))
{
   index=i; 
   difference=fabs(fabs(array[i])-fabs(average));
}