请帮我解决以下程序中的错误。我没有得到小数部分的正确输出。 提前致谢
#include<stdio.h>
#include<math.h>
main()
{
int p,i,j,t,x;
float n,sum,d;
printf("enter the binary number");
scanf("%f",&n);
p=(int)n;
d=n-p;
i=0;
while(p>0)
{
t=p%10;
sum=sum+t*pow(2,i);
p=p/10;
i=i+1;
}
i=1;
while(d>0.0)
{
d=d*10;
x=(int)d;
sum=sum+x*pow(2,-i);
d=d-x;
i=i+1;
}
printf("decimal value is %f",sum);
getch();
}
答案 0 :(得分:2)
你的问题是你在使用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
或8
等)。更重要的是,循环不只迭代4次(1101),它还有更多。这是因为这句话:
d = d * 10;
当d
乘以10
后,它会从0.100998
变为大约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;
}
答案 1 :(得分:1)
我假设您期望输入[01.]*
形式,但约束只有一个小数点。您正在读取此输入,如常规浮点数,但将其十进制数字解释为二进制数字并计算小数值。
main()
应声明为int main ()
。 getch()
不是标准的C呼叫。您可以使用getchar()
。
由于sum
未初始化为0
,您可能会收到疯狂的输出。
计算小数项时,必须记住浮点表示是二进制的,并非所有十进制数都具有精确的表示。所以你需要进行舍入。此外,您正在检查d>0
作为第二个循环的停止条件,但浮点比较比这更棘手。您可以阅读this answer以获得有关它为何棘手的完整说明,但您基本上应该这样做:
float err=.000001;
while(d>err)
{
d=d*10;
err=err*10;
x=(int)(d+.5);
/*...*/
通过将输入作为字符串读取并解析,可以减少代码的浮点复杂性。
char *n;
char p[INPUT_MAX];
char d[INPUT_MAX];
char input[INPUT_MAX];
float sum, p_sum = 0, d_sum = 0;
int i;
printf("enter the binary number: ");
if (fgets(input, sizeof(input), stdin) == 0) {
puts("no input!");
exit(0);
}
n = strchr(input, '.');
if (sscanf(input, "%[01]", p) == 1) {
for (i = 0; p[i] != '\0'; ++i) {
p_sum = 2*p_sum + (p[i] - '0');
}
}
if (sscanf(n, ".%[01]", d) == 1) {
for (i = strlen(d); i > 0; --i) {
d_sum = (d_sum + (d[i-1] - '0'))/2;
}
}
sum = p_sum + d_sum;
printf("decimal value is %f\n",sum);