我在函数中遵循的if语句未按预期运行

时间:2020-10-02 18:11:13

标签: c

我正在编写的以下代码有问题。我正在尝试将电容器与图表上的标准值进行比较,以查看电容器是否在我创建的阵列中。输入0.01、0.001、0.0001等时出现问题。使用以下代码,所有这些数字都应乘以一定的10倍,以使数字在10到99的范围内。例如,当我输入0.01时,它将乘以10,000,而不是原来的1000。如果您发现代码有任何错误,请通知我。

void checkstd_cap (float c)
{
    if(c >= .000001 && c <= 10000)   // This if statement is used to get the users entered capacitor 
    value between 10 and 99, 
                                 // which is the range in the array for capacitor standard values
    {
    if(c >= 10000)
    c /= 1000;
    
    if(c >= 1000 && c <= 9999)
    c /= 100;
    
    if(c >= 100 && c <= 999)
    c /= 10;
    
    if(c >= 10 && c <= 99)
    c /= 1;
    
    if(c >= 1.0 && c <= 9.999999)
    c *= 10;

    if(c >= 0.1 && c <= 0.999999)
    c *= 100;
    
    if(c >= 0.01 && c <= 0.0999999)
    c *= 1000;
    
    if(c >= 0.001 && c <= 0.00999999)
    c *= 10000;
    
    if(c >= 0.0001 && c <= 0.000999999)
    c *= 100000;
    
    if(c >= 0.00001 && c <= 0.0000999999)
    c *= 1000000;
    
    if(c >= 0.000001 && c <= 0.00000999999)
    c *= 10000000;
    }

        int i = 0; // i is initilized to 0
    
        while( i<6 ) /* If i reaches 12, this proves resistor B is not standard
                     and a warning message is printed */
        {
            if (fabs(c - STDVC[i]) <= 0.01)
            {
                printf("Capacitor is a standard value");
                break; /* while loop breaks if this statement above is true as this 
                         proves capacitor is a standard value */
            }
            else
            {
            i++; // if the capacitor is not standard, i keeps incrementing to 6
            }       
        }
        
        while (i == 6) /* If i reaches 6, this proves the capacitor is not standard
                     and a warning message is printed */
        {
            printf("Warning: Capacitor is not a standard value\n");
            break;
        }
}

1 个答案:

答案 0 :(得分:1)

值0.1、0.01、0.001不能精确表示为二进制浮点数。例如,在我的系统上:

float x= 0.01;
printf("x=%.15f\n", x);

打印此:

x=0.009999999776483

这里的主要问题是您如何进行比较:

if(c >= 0.01 && c < 0.0999999)
c *= 1000;

if(c >= 0.001 && c <= 0.00999999)
c *= 10000;

将0.01分配给c时,实际值出现在其中一些范围之间。您需要更改比较,以使范围相邻:

if(c >= 0.01 && c < 0.1)
c *= 1000;

if(c >= 0.001 && c < 0.01)
c *= 10000;

或更妙的是,使用if...else链并检查下限:

if (c >= 10000) {
    c /= 1000;
} else if (c >= 1000) {
    c /= 100;
} else if (c >= 100) {
    c /= 10;
} else  if (c >= 10) {
    c /= 1;
} else if (c >= 1.0) {
    c *= 10;
} else  if (c >= 0.1) {
    c *= 100;
} else if (c >= 0.01) {
    c *= 1000;
} else if (c >= 0.001) {
    c *= 10000;
} else if (c >= 0.0001) {
    c *= 100000;
} else if (c >= 0.00001) {
    c *= 1000000;
} else if (c >= 0.000001) {
    c *= 10000000;
}

更好的是,摆脱if的长链,而只使用一对循环:

while (c < 10) {
    c *= 10;
}
c = round(c);
while (c >= 100) {
    c /= 10;
}

在这里,我们首先处理较小的数字以获得大于10的值,然后将其舍入为整数并处理较大的数字。