실수형 수를 입력 받아 2진수로 변환하는 프로그램 작성

-  c언어의 실수형 자료형은 오차 범위가 존재함. 그래서 실수 표현은 float 대신 double형을 사용하도록 권장..

-  그러나 프로그램은 float형으로 작성 ^^;; float형 실수 입력에서 유효숫자 체크 부분 부족... ㅠㅠ

- 정수부분과 소수부분의 2진 변환 방법이 다름을 주의!

#include <stdio.h>

#include <float.h>


#define MAX_BIT (sizeof(unsigned int)*8)


int ConvertToBinInt(int, unsigned int**);

int ConvertToBinPoint(float, unsigned int**);


int main(void)

{

int nInt = -1, nBinIntCnt = 0, nBinPointCnt = 0, i = 0;

float fValue = 0, fReal = 0;


unsigned int uArrBinInt[MAX_BIT] = {0,};

unsigned int uArrBinPoint[MAX_BIT] = {0,};


do 

{

printf("Enter the value to convert binary: ");

scanf("%f", &fValue);

printf("\(float type - decimal digits of precision: %d \)\n", FLT_DIG);

printf("-Value of input: %f \n", fValue);

} while ((fValue > FLT_MAX) || (fValue < FLT_MIN));



nInt = (int)fValue;

fReal = fValue - (float)nInt;


// convert to binary integer

nBinIntCnt = ConvertToBinInt(nInt, &uArrBinInt);

if(-1 != nBinIntCnt)

{

printf("1. Convert to binary integer(%d): ", nInt);

for(i=0; i<nBinIntCnt; i++)

printf(" %d", uArrBinInt[i]);

printf("\n");

}

else

{

printf("Failed to convert to binary integer. \n");

}


// convert to binary point

nBinPointCnt = ConvertToBinPoint(fReal, &uArrBinPoint);

if(-1 != nBinPointCnt)

{

printf("2. Convert to binary point(%f): ", fReal);

for(i=0; i<nBinPointCnt; i++)

printf(" %d", uArrBinPoint[i]);

printf("\n");

}

else

{

printf("Failed to convert to binary point. \n");

}

return 0;

}


int unsigned ConvertToBinInt(int nDecvalue, unsigned int** ppBin)

{

int nRet = -1, nIdx = 0, i=0;

unsigned int uArrTemp[MAX_BIT] = {0,};


if(nDecvalue == 0 || ppBin == NULL)

return nRet;


while(1)

{

if(nDecvalue > 1)

{

uArrTemp[nIdx++] = nDecvalue % 2;

nDecvalue /= 2;

}

else

{

uArrTemp[nIdx++] = nDecvalue;

break;

}

}


// inverse array

for(i=0; i<nIdx; i++)

*(&ppBin[i]) = uArrTemp[nIdx-i-1];


nRet = nIdx;

return nRet;

}


int ConvertToBinPoint(float fDecValue, unsigned int** ppBin)

{

int nRet = -1, nIdx = 0, nInt=0, i=0;

unsigned int uArrTemp[MAX_BIT] = {0,};

float fPoint = 0;


if(fDecValue == 0 || ppBin == NULL)

return nRet;


do 

{

fDecValue *= 2;

nInt = (int)fDecValue;


uArrTemp[nIdx++] = nInt;

fDecValue -= (float)nInt;

} while (fDecValue > 0 && nIdx <= MAX_BIT);


for(i=0; i<nIdx; i++)

*(&ppBin[i]) = uArrTemp[i];


nRet = nIdx;

return nRet;

}