C++ 데이터 - 부동 소수점

진경천·2023년 9월 5일
0

C++

목록 보기
3/90

실수형

float, double, long double을 통해 변수를 선언한다.

부동 소수점

실수를 표현할 때 소수점의 위치를 고정시키지 않고
지수부와 가수부를 나타내어 표현한 것이다.

10진수 실수를 부동 소수점으로 표현하는 법

  • 10진수를 2진수로 변환
  • 가장 첫번째에 있는 1의 뒤로 소수점을 보내준다.
  • 소수점을 기점으로 부호, 가수부, 지수부를 나눈다.
  • 부호가 있는 경우

  • 부호가 없는 경우

#include <iostream>

using namespace std;

int main(){
	unsigned int num0;
    float num1 = -118.625;
    memcpy(&num0, &num1, sizeof(num1));
    // memcpy 함수를 이용해 num1의 메모리 값을 num0의 주소로 복사함
    
    cout << num0 << endl;
    cout << num1 << endl;
    
    return 0;
}

위 코드를 이용하여 부동 소수점의 가수부를 구할 수 있다.

  • 실행 결과

    3270328320
    -118.625

  • 3270328320 2진수 변환 -> 11000010111011010100000000000000

실수형의 정확도

실수형은 2진수로 나타내기 때문에 정확한 수를 나타낼 수 없다.

#include <iostream>

using namespace std;

int main(){

	float num0 = 0.1f;
    float num1 = 0.02f * 5.0f;
    // 숫자 뒤에 f를 붙여 float으로 형변환을 시켜준다.
    cout.precision(64);
    // cout을 더 정확하게 나타내기 위한 함수로 64자리까지 나타낸다.
    cout << "num0 = " << num0 << endl;
    cout << "num1 = " << num1 << endl;
    
    return 0;
}

위 코드를 이용하여 실수형의 정확한 값을 출력할 수 있다.

  • 코드 실행 결과

    num0 = 0.100000001490116119384765625
    num1 = 0.0999999940395355224609375

#include <iostream>
#include <cfloat>

using namespace std;

int main(){
	float num0 = 1.0f;
    float num1 = 0.0f;
    
    for(int i= 0; i < 10; i++)
    	num1 += 0.1;
        
    if(num0 == num1)
    	cout << "equal 0" << endl;
    if(fabsf(num0 - num1) <= FLT_EPSILON)
    	cout << "equal 1" << endl;
        
    // fabsf()를 이용해 절대값으로 치환
    
    return 0;
}

위 코드를 이용해 오차를 확인 할 수 있다.

  • 코드 실행 결과

    "equal 1"

  • FLT_EPSILON
    부동 소수점이 양수로 표현 할 수 있는 수 중에 가장 작은 수
  • FLT_MAX
    부동 소수점으로 표현 할 수 있는 수 중에 가장 큰 수
  • FLT_MIN
    부동 소수점으로 표현 할 수 있는 수 중에 작은 큰 수
profile
어중이떠중이

0개의 댓글