전체 코드

namespace CSharpGrammar
{
    class Program
    {
       

        static void Main(string[] args)
        {

            // float

            //// 정수 예제
            //// [ 100 ]
            //int a;
            //a = 100;

            //// 데이터 읽어서 사용

            //Console.WriteLine(a);

            // 정확하게 표현하는 숫자가 아님
            // 무한한 숫자를 유한한 공간에서 표현해야함 따라서 근사한 값을 추정해서 표현

            // 정수형도 데이터 크기와 메모리 공간에 따라서 여러가지 옵션이 있는것처럼

            // 실수형도 float, double이 있음

            // float은 접미사 f를 붙여야 하지만 double은 아님

            // float 4byte double은 8byte로

            // double이 더 정밀도 높게 표현 가능
            float a;
            a = 3.5f;

            Console.WriteLine(a);


        }
    }
}

1. float의 정의

float
  • 데이터 타입 소개
    float은 소수점을 포함한 부동소수점 숫자를 저장하기 위한 데이터 타입입니다.
    • "부동소수점"이란?
      • 숫자의 정수부와 소수부를 분리하여, 메모리 크기에 맞추어 숫자를 효율적으로 저장하는 방식입니다.
      • float은 4바이트(32비트)를 사용하여 약 7자리 정도의 정밀도로 숫자를 표현할 수 있습니다.
    • 예를 들어, 3.14, -2.718, 0.00001 등의 숫자를 저장할 때 사용됩니다.

2. float 변수 선언

float a;
  • 변수 선언
    a라는 이름의 float 타입 변수를 선언합니다.
    • 이 시점에서는 변수 a가 선언만 되었을 뿐, 초기값이 할당되지 않았습니다.
    • 변수 선언은 메모리에서 해당 변수를 위한 4바이트 공간을 예약하는 작업입니다.

3. float 변수 초기화

a = 3.5f; // f가 붙어야 float 타입 붙이지 않으면 double 타입
  • 변수 초기화
    변수 a3.5f라는 값을 할당합니다. 여기서 중요한 점은 숫자 뒤에 f 접미사가 붙어야 한다는 것입니다.
    • C#에서 소수점이 있는 숫자는 기본적으로 double 타입으로 간주됩니다.
    • 따라서 3.5float 타입 변수에 저장하려면 f를 붙여야 합니다.
      • 예: float a = 3.5f; (올바름)
      • 예: float a = 3.5; (컴파일 오류 발생)
    • f는 숫자가 float 타입임을 명시적으로 나타냅니다.

4. float의 한계: 근사값

// 완전 정확한 숫자가 아님
  • 정확성의 제한
    float 타입은 제한된 메모리 크기(4바이트)로 숫자를 표현하기 때문에 모든 숫자를 완벽하게 저장할 수 없습니다.
    • 예를 들어, 0.333333...(무한 소수)와 같은 숫자는 float 타입으로 저장할 때 근사값으로 저장됩니다.
    • 이는 부동소수점 방식의 특징으로, 컴퓨터는 가장 근사한 값을 저장합니다.
    • 결과적으로, float 타입을 사용할 경우 미세한 오차가 발생할 수 있습니다.

5. 메모리의 유한성

// why 메모리가 유한하기 때문
  • 메모리 제한
    컴퓨터는 물리적인 메모리 크기가 유한하기 때문에, float 타입도 4바이트 내에서 표현할 수 있는 값의 범위와 정밀도가 제한됩니다.
    • float 타입은 정수부와 소수부를 나누어 저장합니다:
      • 1비트: 부호 비트 (양수/음수)
      • 8비트: 지수 (Exponent, 소수점의 위치)
      • 23비트: 가수 (Mantissa, 실제 숫자)
    • 이 제한된 구조 때문에 float은 숫자를 근사치로 표현할 수밖에 없습니다.

6. 부동소수점 방식

// 컴퓨터가 근사값을 추정함
  • 근사값 저장
    컴퓨터는 부동소수점 방식을 사용하여 숫자를 표현합니다.
    • 숫자를 2진수로 변환한 후, 정수부와 소수부를 나누어 저장합니다.
    • 예를 들어:
      • 3.5는 2진수로 11.1입니다.
      • 이를 부동소수점 방식으로 저장하면:
        • 부호: 0 (양수)
        • 지수: 10000001 (소수점 위치)
        • 가수: 110000... (숫자의 유효숫자)

7. float의 크기와 정밀도

// 4바이트임
  • 메모리 크기
    float은 4바이트(32비트) 크기의 메모리를 사용합니다.
    • 정밀도: 약 7자리(소수점 포함)의 숫자를 정확히 표현할 수 있습니다.
    • 값의 범위: 약 -3.4 * 10^38 ~ +3.4 * 10^38까지 표현할 수 있습니다.
    • 더 높은 정밀도가 필요하다면, double(8바이트)을 사용할 수 있습니다.

8. float vs double

float f = 3.14f;  // 4byte 
double d = 3.14;  // 8byte
  • 메모리 크기 비교
    • float: 4바이트, 약 7자리 정밀도.
    • double: 8바이트, 약 15자리 정밀도.
  • 사용 예:
    • float: 정밀도가 크게 필요하지 않은 계산(예: 게임의 속도, 거리).
    • double: 과학 계산, 금융 데이터 등 높은 정밀도가 필요한 경우.

9. 실수 연산의 비용

// 실수의 연산은 정수 연산보다 비싸다.
  • 실수 연산의 복잡성
    실수 연산은 정수 연산보다 더 많은 계산 단계를 필요로 하기 때문에 성능 비용이 더 큽니다.
    • 예: 덧셈, 곱셈 등의 단순한 연산조차 정수보다 느립니다.
    • 따라서 성능이 중요한 애플리케이션에서는 가능한 float이나 double 연산을 최소화해야 합니다.

10. 게임에서의 float 사용

// 소수단위까지 정밀하게 판정할 필요가 없는 게임 정도는 float만 해도 충분하다.
  • 게임에서의 적합성
    게임에서는 초당 프레임 처리량(성능)이 중요하기 때문에, 메모리를 적게 사용하고 연산이 더 빠른 float 타입이 적합합니다.
    • 예: 캐릭터의 속도(speed = 3.5f)나 위치 데이터 등.
    • 정밀도가 낮아도 큰 문제가 없는 경우, float만으로 충분합니다.

profile
李家네_공부방

0개의 댓글