2014-11-25 3 views
0

Напишите программу для печати двоичной формы двойного? Я считал, что например: 1 Представление должно быть напечатано. Правильно ли печатать так? Или я должен напечатать в , например: 2.Является ли моя интерпретация правильной? Могу ли я печатать двоичное представление для double, например: 1?

например:

  1. бинарное представление для 23.5 является 0000000000000000000000000010111,1

  2. где формат IEEE754 говорит реальные данные, хранящиеся в памяти компьютера, как

    0 | 10000011 | 01111000000000000000000000000000000000000000000000000000

    знак | экспоненты | мантисса

    #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]); 
    
    } 
    

    Е ("");

    for(i=0;i<=n;i++) 
    
    { 
    printf("%d",b[i]); 
    

    }

    printf("\n"); 
    

    }

В приведенном выше коде, чтобы остановить рецидив, я дал перерыв заявление, чтобы разорвать петлю. Я проверил значения 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, чтобы остановить повторение. Таким образом, согласно моему анализу моего кода, второй выход исполнение должно быть как выше format.But я получаю ниже выход для 23,4

enter double:23.4 
0000000000000000000000000010111.01100110011001100110011001100110011001100110011 

Я не могу понять, что делает второй для контура прекращения после печати 47 бит.

+0

Даже не близко. Во-первых, вы передаете 'int'. Как насчет всех тех, кто выходит за пределы диапазона int? Я не уверен, что вы думаете, что это должно делать. –

+1

Что именно вы подразумеваете под «двоичным форматом двойного»? Вы пытаетесь распечатать внутренний формат, в котором хранится номер, или напечатать номер в виде дробного десятичного знака? (Совершенно иная.) – duskwuff

+0

напечатать число как дробное десятичное число –

ответ

0

Ваш код действительно отображает правильный результат. 0.5=1/2, поэтому у 23.5 есть только одно «двухцилиндровое». Это не относится к 0,4, который имеет бесконечное число «двухцилиндровых».

formula

С printf(), вы можете распечатать interger с использованием в его шестнадцатеричном (гексе = 16) представления с флагом %x и двойным, используя его шестнадцатеричное представление с плавающей точкой с %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.