gpt4 book ai didi

c - 我的解释正确吗?我可以打印 double 的二进制表示形式,例如 :1?

转载 作者:行者123 更新时间:2023-11-30 17:25:01 25 4
gpt4 key购买 nike

编写一个程序来打印 double 的二进制形式?我认为, eg:1 表示将被打印。这样打印正确吗?或者我应该以 eg:2 格式打印。

例如:

  1. 23.5 的二进制表示为 0000000000000000000000000010111.1

  2. 其中 IEEE754 格式表示存储在计算机内存中的真实数据为

    0 | 10000011 | 0111100000000000000000000000000000000000000000000000

    标志|指数 |有效数

    #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 循环终止的原因。

最佳答案

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

formula

使用 printf(),您可以使用带有标志 %x 的十六进制 (hexa=16) 表示形式打印整数,并使用带有 %x 标志的十六进制浮点表示形式打印 double %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's double mantissa的大小.

关于c - 我的解释正确吗?我可以打印 double 的二进制表示形式,例如 :1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com