ted0505
Computational Art & Study
ted0505
전체 방문자
오늘
어제
  • 분류 전체보기 (79)
    • Computer Science ( CS ) (0)
    • Computational Thinking (6)
    • 프로젝트 개발일지 (1)
    • Coding (52)
      • C++ (39)
      • JavaScript (2)
      • P5.JS (7)
      • Python (0)
      • HTML5 (1)
      • CSS (0)
    • Game Engine (18)
      • Unreal Engine 4 (18)
      • Unity (0)
    • Physically Based Rendering (0)
    • FilmMaking (0)
    • 잡다 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ted0505

Computational Art & Study

Coding/C++

[ C++ ] 02.05 - 부동 소수점 숫자 ( floating point numbers )

2022. 1. 14. 14:23

02.05 - 부동 소수점 숫자 ( floating point numbers )

부동 소수점 자료형은 3.141592 와 같은 실수를 저장하는 데이터 자료형이다.

C++에는 float, double, long double 과 같은 부동 소수점 자료형이 있다.

Type Minimum Size Typical Size
float   4 bytes  
double  8 bytes 8 bytes
long double 8 bytes 8, 12, 16 bytes

 

float f 	= 3.14159f;
double d 	= 3.14159;
long double 	= 3.14159;

*float 자료형은 f 접미사를 리터럴에 붙여주어야 컴파일러가 제대로 인식한다. 붙지 않을 경우, double 자료형으로 판단한다.

 

정밀도와 범위 (Precision and range)

1.0 / 3.0 을 10진수로 표현하면 0.3333333... 무한소수가 계산된다.

float, double, long double 데이터 자료형은 크기가 4, 8 byte 등 제한이 있기 때문에, 특정 유효 숫자까지만 저장하고 나머지는 손실된다.

 

부동 소수점의 정밀도(precision)는 정보 손실 없이 나타낼 수 있는 자릿수를 정의한다.

 

std::cout의 기본 정밀도는 '6' 이다. 즉, 부동소수점은 6자리까지만 나타내고 나머지는 잘라낸다.

그러나, <iomanip> 헤더 파일에 정의된 std::setprecision() 함수를 사용해서 cout에서 출력되는 기본 정밀도를 재정의(override)할 수 있다.

즉, 정밀도 조절은 해당 값에 영향을 주는 것이 아닌 '출력'의 정밀도만을 표현하는 것이다.

 

부동 소수점 자료형의 변수가 가지는 정밀도는 자릿수 크기('float은 double보다 작다.)와 저장되는 특정 값에 따라 달라진다. float 값의 정밀도는 6 ~ 9 자리다. double 값의 정밀도는 15 ~ 18 자리로 16. long double 은 얼마나 많은 바이트를 차지하느냐에 따라 최소 15, 18 또는 33의 자리 정밀도를 가진다.

정밀도 문제는 단지 소수점 이하의 숫자에만 영향을 미치는 것이 아니라, 너무 많은 유효 숫자에도 영향을 미친다. 큰 숫자를 고려해 보자.

 

반올림 오류 (Rounding errors)

컴퓨터에서는 2진수의 조합으로 10진수의 실수들을 표현하기 때문에, 부동 소수점 계산은 정확한 결과 값을 표현하기 어렵다. 

#include <iostream>
#include <iomanip>

int main()
{
	using namespace std;

	double i = 0.1;
	cout << i << endl;			// 0.1
	cout << setprecision(17);		// 정밀도 조절
	cout << i << endl;			// 0.10000000000000001
}

위와 같이 double 타입의 변수 i에 0.1을 대입했지만, 정확한 0.1의 값을 가지지 못한다.

cout의 출력되는 기본 정밀도가 (6) 이기 때문에, 정확한 0.1의 값을 가지는 것처첨 보일 뿐이다.

메모리 제한으로 인해 근사치를 잘라내야 하기 때문에 정확한 10진수 0.1 의 값을 가지지 못하는 것이다.

 


출처: https://boycoding.tistory.com/152?category=1007180 [소년코딩]

 

 

 

 

 

'Coding > C++' 카테고리의 다른 글

[ C++ ] 논리 연산자 (Logical Operators)  (0) 2022.01.23
[ C++ ] 02.08 상수 constants  (0) 2022.01.18
[ C++ ] Variable 과 Fundamental Data Type  (0) 2022.01.13
[ C++ ] namespace_명칭공간  (0) 2022.01.12
[ C++ ] 헤더 파일 / 헤더 가드  (0) 2022.01.12
    'Coding/C++' 카테고리의 다른 글
    • [ C++ ] 논리 연산자 (Logical Operators)
    • [ C++ ] 02.08 상수 constants
    • [ C++ ] Variable 과 Fundamental Data Type
    • [ C++ ] namespace_명칭공간
    ted0505
    ted0505

    티스토리툴바