독개

#따배씨 2.5 부동소수점수 floating pint numbers

by #독개#

double은 float의 두배라 더블이다

 

요새 거의 기본적으로 double을 기본으로 가져가지만 컴퓨터가 많이 좋아졌다지만 정말 최소의 효율적인 프로그램을

 

만들땐 float를 쓴다 파이썬은 기본적으로 double을쓰나 딥러닝할땐 float 써줌

 

어려우면 몰라도 된다

 

 

 

사용법 보다는 주의사항

 

1. 0으로 나누면 안된다 inf / -inf / nan 중에나온다. 나눌때 입력을 0를 받으면 안된다

2. 3.14e-1 , 3.14e1 이런 표기법을 알자

3. 컴퓨터는 소수를 정의할때 0.1이라고하면 0.1000000000000000001 이런식으로 끝까지 가면 오차가있다

    대형 프로젝트에선 이 누적으로 나중에 오류가 날수도있다

 

#include <iostream>
#include <iomanip> //setprecision 사용
#include <cmath> //isnan, isinf 사용

int main()
{
	using namespace std;	
	float a(3.14);
	float b(3.14e10);
	int c(12345);

	//!이렇게 표현할수 있다 라는 표현법 알아둬야한다

	cout << 3.14 << endl;		//출력3.14
	cout << 31.4e-1 << endl;	//출력3.14
	cout << 31.4e-2 << endl;	//출력0.314
	cout << 31.4e1 << endl;		//출력314
	cout << 31.4e2 << endl;		//출력3140

	//!핵심은 컴퓨터가 소수로 계산할때 정확하지 않다 엄청~~ 끝까지 가면 약간의 오차가 존재한다
	//! 0.1을 17자리까지 표시하면 0.10000000000000001 이 나온다 컴퓨터는 소수에 있어서 아주 정확하지는 않다
	//!이게 누적이되면 나중에 다른값이 나올수도 있다 라는점만 알고있자 나한테는 해당안될듯

	double d1(1.0);
	double d2(0.1 + 0.1 + 0.1 +0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);
	
	cout << std::setprecision(17); //앞으로 소수를 9개의 자리수만큼만 하겠다
	cout << d1 << endl; //출력 1
	cout << d2 << endl;	//출력 0.9999999999999999989

	
	//! 0으로 나누면안됨 이렇게 나오나보다가 중요한게아니라 프로그램짤때 입력으로 이런걸 받으면안된다
	double zero = 0.0;				
	double posinf = 5.0 / zero;		//출력inf (infinite 무한대란말)
	double neginf = -5.0 / zero;	//출력-inf
	double tad = zero / zero;		//출력 nan

	cout << posinf << endl;
	cout << neginf << endl;
	cout << tad << endl;

	cout << posinf << " " << std::isinf(posinf) << endl;	//inf이므로 1이나옴
	cout << neginf << " " << std::isinf(neginf) << endl;	//inf이므로 1이나옴
	cout << tad << " " << std::isnan(posinf) << endl;		//nan이므로 1이나옴
	cout << 0.1 << " " << std::isnan(0.1) << endl;			//nan아니라 정상숫자이므로 0


	/*
		강의는 3.5관계연산자에 나오는건데 부동소수점에 추가기록
		소수점계산할때
		신경써야하는게 우리눈에 0.1이라고 다 같은 0.1이 아니다
		컴퓨터는 소수에서 오차가 있고, 이오차는 관계연산할때 문제를 일으킨다
	*/
	double d1(100 - 99.99); //0.001이라 생각
	double d2(10 - 9.99); 	//0.001이라 생각
	cout << ((d1 == d2) ? "같다" : "다르다") << endl; //다르다가 나온다
	cout << std::abs(d1 - d2) << endl; //abc를 활용해 차이의 절대값을 구해서 얼마나 차이나나 보자
	//차이가 5.32907e-15가 난다

	//솔직히 이건 0.00000000000000015 이것인데 이정도로 같은건 같다고해야하는데 컴퓨터는 틀리다고한다
	//이부분을 우리가 잡아줘야하는데

	const double epsilon = 1e-10;

	if(std::abs(d1 - d2) < epsilon)
		cout << "Approximately equal" << endl;
	else
		cout << "Not equal" << endl;

	return 0;
}

 

 

 


🐱‍👓독하게 개발

블로그의 정보

독한 개발자

#독개#

활동하기