IT 프로그래밍/C++

[따배시 2.3~5] C++ 고정 너비 정수, Void, 부동소수점 수

기술1 2024. 3. 6. 16:45
반응형
cout << std::setprecision(16) << endl;
#include <iostream>
#include <cstdint>

int main()
{
	using namespace std;

	std::int16_t i(5);
	std::int8_t myint = 65;

	cout << myint << endl;

	std::int_fast8_t fi(5);
	std::int_least64_t fl(5);
}

위 함수는 고정 너비 정수를 나타낸 것으로 

 

std::int16_t 는 16비트의 정수형, int8_t는 8비트 정수형을 의미합니다. 또한 myint 변수를 6로 초기화했습니다. 

 

std::int_fast8_t는 최소한의 크기를 보장하면서 가장 빠른 정수형을 의미합니다. std::int_least64_t fl(5);는 적어도 64비트를 보장하는 정수형입니다. 

 

Void 타입


void my_function(void)
{

}

리턴타입이 없을 때도 이렇게 void를 넣어주어야 합니다.

 

voi는 메모리 자체가 없기 때문에 선언을 할 수 없습니다. 

int main()
{
	int i = 123;
	float f = 123.456;

	void* my_void;
	my_void = (void*)&i;
	my_void = (void*)&f;
}

하지만 포인터를 이용해 void *my_void; 이런 식으로는 가능합니다. &i는 변수형 정수의 주소입니다. &f는 실수형 변수의 주소가 되는 것입니다. 

 

어떤 데이터 타입은 메모리를 많이 차지하지만 첫 주소의 데이터의 양은 동일합니다.  

 

부동소수점수


영역 최소 크기 전형적인 크기
부동소수점 float 4 4
  double 8 8
  Long double 8 8, 12, 16

 

int main()
{
	using namespace std;

	float f;
	double d;
	long double ld;

	cout << numeric_limits<float>::max() << endl;
	cout << numeric_limits<double>::max() << endl;
	cout << numeric_limits<long double>::max() << endl;
}

 

여기서 numeric_limits는 C++표준 라이브러리에서 제공하는 클래스 템플릿입니다. 데이터 타입의 수치적 특성을 사ㅣ용하는데 사용되며 최소값, 최대값, 정밀도 등의 정보를 제공합니다.

 

FLOAT, DOUBLE,long double 타입의 최댓값을 출력하는 것입니다.

 

#include <iostream>
#include <cstdint>
#include <limits>

int main()
{
	using namespace std;

	float f(3.141592f); //3.14 = 31.4 * 0.1

	cout << 3.14 << endl;
	cout << 31.4e-1 << endl;
	cout << 31.4e-2 << endl;
	cout << 31.4e1 << endl;
	cout << 31.4e2 << endl;

}

 

 

 

숫자 수 조절하기


#include <iostream>
#include <limits>
#include <iomanip>


int main()
{
	using namespace std;


	cout << std::setprecision(16) << endl;
	cout << 1.0 / 3.0 << endl;

	return 0;
}

부동 소수점의 숫자를 출력할 때 아래 자릿수를 지정하는 것입니다.

 

<iomanip> 가 입출력의 형식을 제어하기 위한 헤어 파일입니다. 

 

cout << std::setprecision(16) << endl;

여기서 std::setprecision(16)은 부동 소수점의 숫자의 소수점 아래 자릿수를 16자리로 설정한다는 것입니다.

 

 

#include <iostream>
#include <limits>
#include <iomanip>


int main()
{
	using namespace std;

	double zero = 0.0;
	double posinf = 5.0 / zero;
	double neginf = -5.0 / zero;
	double nan = zero / zero;

	cout << posinf << endl;
	cout << neginf << endl;
	cout << nan << endl;

	return 0;
}

이렇게 0을 대입하면  inf , -inf , -nan(ind) 이런 무한대나 값을 정의할 수 없는 기로가 나오게 됩니다. 이런 숫자가 나오면 안되기 때문에 코딩을 할 때 이런 경우를 대비해서 NaN 연산자를 넣어주어야 합니다. 

 

#include <iostream>
#include <limits>
#include <iomanip>
#include <cmath>


int main()
{
	using namespace std;

	double zero = 0.0;
	double posinf = 5.0 / zero;
	double neginf = -5.0 / zero;
	double nan = zero / zero;

	cout << posinf << std::isnan(nan) << endl;
	cout << neginf << std::isnan(nan) << endl;
	cout << nan << " " << std::isnan(nan) << endl;
	cout << 1.0 << " " << std::isnan(nan) << endl;

	return 0;
}

nan은 Not a Number의 약자입니다. 부동 소수점의 숫자 중 하나로, 유효한 숫자가 아닌 값을 나타냅니다. NaN인지 여부를 검사하고 그 결과를 반환합니다. 

 

 

반응형