실수형 수를 입력 받아 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;
}
'컴&프로그래밍 > C' 카테고리의 다른 글
팩토리얼 수 구하기 (재귀함수) (0) | 2014.10.24 |
---|---|
피라미드 별찍기 (0) | 2014.10.12 |
이진검색 (0) | 2014.10.11 |
파일 복사 하기 (0) | 2014.10.11 |
학생 정보 입력 받아 성적순으로 내림차순 정렬 출력 (1) | 2014.10.11 |
정수 입력하여 16진수 변환후 2씩 곱해가기 (0) | 2014.10.11 |
진법 계산 (0) | 2014.10.11 |
대소문자 바꿔서 출력 (0) | 2014.10.11 |
3n + 1 문제 (The 3n+1 Problem) (0) | 2014.10.11 |