부동 소수점 형식 (Floating Point Type)

  • 부동 소수점을 이용하여 표현하면, 소수점을 이동해 수를 고정했을 때 보다
    더 제한된 bit더 넓은 범위를 표현할 수 있음
  • 하지만 해당 형식은 정수 형식을 대체할 수 는 없음
    • 소수점, 부호를 표현하기 위해 일부 비트를 사용
      • 같은 크기의 정수 계열 형식과 같은 크기의 수를 표현할 수 없음
    • 산술 연산 과정이 정수 계열 형식보다 복잡해서 느림
데이터 형식 설명 크기(byte) 범위
float 단일 정밀도 부동 소수점 형식
(7개의 자릿수만 다룰 수 있음)
4(32bit) -3.402823e38
3.402823e38
double 복수 정밀도 부동 소수점 형식
(15~16개의 자릿수를 다룰 수 있음)
8(64bit) -1.79769313486232e308
1.79769313486232e308

정밀도

  • 4 byte (36bit) 크기의 float 형식은 수를 표현
    • 1bit를 부호 전용(sign bit)으로 사용
    • 가수부 23bit (Mantissa)를 수를 표현하는데 사용
    • 지수부 8bit (Exponent) 소수점을 나타내기 위해 사용

  • float 의 경우 -3.402823e38 ~ 3.402823e38 에 이르는 큰 수를 다루지만, 유효숫자는 7자리 뿐
  • 7자리 이상의 수는 대략적으로표현해서 float 의 경우 한정된 정밀도 (Single Precision)를 가짐
  • double의 경우 두 배의 메모리(8byte)를 사용하여 복수 정밀도 (double Precision)을 가짐
public static class IntegralTypes  
{  
	private static void Main()  
	{
		FloatingPoint();  
	}

	private static void FloatingPoint()  
	{  
		double a = double.Pi;  
		WriteLine($"double : {a}");  
		
		float b = (float)a;  
		WriteLine($"float : {b}");  
	}
}

decimal 형식

  • 부동소수점과는 다른 방식으로 소수를 다루며 정밀도가 훨씬 높은 형식
데이터 형식 설명 크기(byte) 범위
decimal 29자리 데이터를 표현할 수 있는 소수형식 16(128bit) +-1.0 x 10e-28
+-7.9 x 10e28
public static class IntegralTypes
{
	private static void Main()
	{
		Decimal();
	}

	private static void Decimal()  
	{  
		decimal a = 3.1415_9265_3589_7932_3846_2643_3832_79m;  
		WriteLine($"Decimal: {a}");  
		double b = 3.1415_9265_3589_7932_3846_2643_3832_79;  
		WriteLine($"Double: {b}");  
		float c = 3.1415_9265_3589_7932_3846_2643_3832_79f;  
		WriteLine($"Float: {c}");  
	}
}