[英]Is my interpretation correct?Can I print binary representation for double, as eg:1?
写一个程序来打印二进制形式的double吗? 我认为, 例如:1表示将被打印。 这样打印是否正确? 还是应该以eg:2格式打印。
例如:
23.5的二进制表示形式是0000000000000000000000000010111.1
IEEE754格式表示存储在计算机内存中的真实数据为
0 | 10000011 | 0111100000000000000000000000000000000000000000000000000000000000
标志| 指数| 重要的
#include<stdio.h> main() { double decimal,decimal1,f; int nbits,num,i,j,a[32],b[50],n; printf("enter double:"); scanf("%lf",&f); num=(int)f;//to get integral part of float /*finding binary equivalent of integral part and storing them in an array */ nbits=sizeof(num)*8-1; j=nbits; for(i=0;i<=nbits;i++) { a[j]=(num>>i)&1; j--; } f=(f>0)?f:(-f);// to get absolute value if float is a negative number num=(num)>0?num:(-num); decimal=f-(double)num; decimal1=decimal; /*to get binary equivalent of decimal part*/ for(i=0;decimal!=0;i++) { decimal=decimal*2; b[i]= (int)decimal; n=i; if(decimal==decimal1) //to stop recurrence of decimal points { break; } if(decimal>=1) { decimal=decimal-1; }
}
for(i=0;i<=31;i++) { printf("%d",a[i]); }
printf(“。”);
for(i=0;i<=n;i++) { printf("%d",b[i]);
}
printf("\\n");
}
在上面的代码中,为阻止重复发生,我给出了break语句来中断循环。 我已经为每次迭代检查了值decimal1和十进制 。 即使decimal1 = decimal ,循环也不会中断。 但是,当n = 46时,循环将终止。 我无法理解那里正在发生什么。 请帮我纠正。
我想知道我的代码是否正确,以打印double等效的二进制代码。
我需要以以下形式获取输出
1st execution:
enter double:23.5
0000000000000000000000000010111.1
2nd execution:
enter double:23.4
0000000000000000000000000010111.0110
在第二次执行中,我输入了23.4。 0.4的二进制等效项是0110的重复发生。我已经使用break语句来停止重复发生。 因此,根据我对代码的分析,第二次执行输出应该类似于上面的格式,但是我得到的下面的输出为23.4
enter double:23.4
0000000000000000000000000010111.01100110011001100110011001100110011001100110011
我无法理解在打印47位后第二个循环终止的原因。
您的代码实际上显示正确的结果。 0.5=1/2
所以23.5只有一个“两个动物”。 它不是0.4,它具有无限数量的“两个小动物”。
使用printf()
,可以使用带有标志%x
十六进制(hexa = 16)表示形式打印整数,并使用带有%a
十六进制浮点表示形式来打印整数。 使用%.9a
显示9个“ 16-位数”。
一段代码对其进行测试:
#include <stdio.h>
int main()
{
double a=23.5;
int ai=(int)a;
double b=a-ai;
printf("a : %.9a ai : %x b=a-ai : %.15a == %.20g\n",a,ai,b,b);
a=23.4;
ai=(int)a;
b=a-ai;
printf("a : %.9a ai : %x b=a-ai : %.15a == %.20g\n",a,ai,b,b);
return 0;
}
结果是:
a : 0x1.780000000p+4 ai : 17 b=a-ai : 0x1.000000000000000p-1 == 0.5
a : 0x1.766666666p+4 ai : 17 b=a-ai : 0x1.999999999998000p-2 == 0.39999999999999857891
请注意最后的8:递归表示会被8和所有零所遗漏...并且for循环直到decimal==0
才会中断。 打印的总位数为47 + 5 = 52,即IEE754的double
尾数的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.