我正在编写的以下代码有问题。我正在尝试将电容器与图表上的标准值进行比较,以查看电容器是否在我创建的阵列中。输入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;
}
}
答案 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的值,然后将其舍入为整数并处理较大的数字。