你的问题是当你应该使用 int 并且你没有初始化任何变量时你正在使用 float 。更改float
并int
初始化您的变量0
,您的代码将起作用。
您的代码不起作用的原因sum
是没有初始化。当您使用 时sum = sum + t * pow (2, i)
,您将在第一次运行时将任意数字添加到结果中。sum
在初始化之前可以是任何东西(即-1241232
)。
尽管真正需要初始化的唯一变量是sum
、d
和i
,但无论如何初始化它们是一个好习惯(安全总比抱歉好)。事实上,初始化变量是一个非常常见的错误原因。初始化一切。
在第二个循环中,浮点数据类型也会导致代码出现问题。当用户输入一个浮点数时,比如 110.1101,它会近似为另一个数字(即 110.110098)——这与浮点数据类型的限制有关。在您的第二个循环中,输入近似为 110.1100998,问题是由以下语句引起的:
sum = sum + x * pow (2.0f, -i);
因为 x 不是1
或0
贯穿整个循环(有时是9
or8
等)。更重要的是,循环不仅仅迭代 4 次(1101),它还做了更多。这是因为这个声明:
d = d * 10;
当d
乘以 时10
,它会从0.100998
变为 about 1.00979
-1.00998
不像你所期望的那样。当您输入比单个数字更精确的值时,这两个差异导致您的结果错误。
最后,这是一些工作代码:
#include <stdio.h>
#include <math.h>
int main (){
int p = 0, i = 0, j = 0, t = 0, x = 0;
float n = 0.0f, sum = 0.0f, d = 0.0f;
printf("enter the binary number: ");
scanf("%f", &n);
p = n;
d = n - p;
while (p > 0){ // never use the float datatype for iteration
t = p % 10;
sum = sum + t * pow (2.0f,i);
p = p / 10;
i = i + 1;
}
i = 1;
while (d > 0.00001){
d = d * 10;
x = d;
sum = sum + x * pow (2.0f, -i);
d = d - x;
i = i + 1;
}
printf ("decimal value is %f\n", sum);
getchar ();
return 0;
}