【发布时间】:2015-01-23 18:09:27
【问题描述】:
写一个程序打印二进制形式的double?我估计要打印 eg:1 表示。这样打印是否正确?或者我应该以 eg:2 格式打印。
例如:
23.5 的二进制表示为 0000000000000000000000000010111.1
-
其中 IEEE754 格式将存储在计算机内存中的真实数据表示为
0 | 10000011 | 01111000000000000000000000000000000000000000000000000
签名 |指数 |有效位
#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 和 decimal 值。即使 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 位后 第二个 for 循环 终止的原因。
【问题讨论】:
-
甚至没有关闭。首先,您投射到
int。那些超出 int 范围的双精度数呢?我不确定你认为这应该做什么。 -
“double 的二进制格式”究竟是什么意思?您是要打印存储数字的内部格式,还是将数字打印为小数? (完全不同。)
-
将数字打印为小数
-
有什么特别的理由不将 printf 与浮点格式说明符之一一起使用,例如 %g?