【问题标题】:Is my interpretation correct?Can I print binary representation for double, as eg:1?我的解释正确吗?我可以打印双精度的二进制表示,例如:1吗?
【发布时间】:2015-01-23 18:09:27
【问题描述】:

写一个程序打印二进制形式的double?我估计要打印 eg:1 表示。这样打印是否正确?或者我应该以 eg:2 格式打印。

例如:

  1. 23.5 的二进制表示为 0000000000000000000000000010111.1

  2. 其中 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 语句来中断循环。我检查了每次迭代的 decimal1decimal 值。即使 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?

标签: c binary double


【解决方案1】:

您的代码实际上显示了正确的结果。 0.5=1/2 所以 23.5 只有一个“两位数”。 0.4不是这样的,它有无数个“二进”。

使用printf(),您可以使用带有标志%x 的十六进制(hexa=16) 表示打印一个整数,并使用带有%a 的十六进制浮点表示打印一个双精度数。使用%.9a 显示9个“16-cimals”。

一段代码来测试它:

#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 和所有的 0 遗漏了......并且 for 循环在 decimal==0 之前不会中断。打印的总位数为47+5=52,即IEE754's double mantissa的大小。

【讨论】:

    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2016-04-30
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多