#10. [모던 C++ STL] 숫자
- (C++11~) complex에
proj()
이 추가되었습니다.- (C++11~) 공통 수학 함수가 보강되었습니다.
- (C++11~) 부동 소수점 환경이 추가되었습니다.
- (C++11~) 난수 생성기가 추가되어 다양한 형태의 난수를 만들 수 있습니다.
- (C++17~) 특수 수학 함수가 추가되었습니다.
- (C++20~) 수학 상수(e_v, log2e_v, log10e_v, pi_v 등)가 추가되었습니다.
- (C++20~) 비트 조작 관련 함수(has_single_bit(), bit_ceil(), bit_floor(), bit_width(), rotl(), rotr(), countl_zero(), countl_one(), countr_zero(), countr_one()등)와 endian처리가 추가되었습니다.
- (C++20~) complex의 constexpr 지원이 개선되었습니다.
complex
복소수를 처리하는 개체입니다.
항목 | 내용 | constexpr |
---|---|---|
= |
(작성중) | (C++20~) |
real() |
(작성중) | (C++11~) (C++20~) |
imag() |
(작성중) | (C++11~) (C++20~) |
+=, -=, *=, /= |
(작성중) | (C++20~) |
+, - |
(작성중) | (C++20~) |
+, -, *, / |
(작성중) | (C++20~) |
== != (~C++20) |
(작성중) | (C++14~) |
<<, >> |
(작성중) | |
abs() |
(작성중) | |
arg() |
(작성중) | |
norm() |
(작성중) | (C++20~) |
conj() |
(작성중) | (C++20~) |
proj() (C++11~) |
(작성중) | |
polar() |
(작성중) |
(C++14~) 표준 사용자 정의 리터럴이 추가되어
operator ""s
,operator ""min
,operator ""if
, 등 문자열, 날짜 / 시간, 복소수 관련 표현이 간편해 졌습니다.
valarray
값의 집합을 다루는 개체 입니다.
항목 | 내용 |
---|---|
= |
(작성중) |
[] |
(작성중) |
+, -, ~, ! |
(작성중) |
+=, -=, *=, /=, %= |
(작성중) |
&=, |=, ^= |
(작성중) |
<<, >> |
(작성중) |
swap() |
(작성중) |
size() |
(작성중) |
resize() |
(작성중) |
sum() |
(작성중) |
min() |
(작성중) |
max() |
(작성중) |
shift() |
(작성중) |
cshift() |
(작성중) |
apply() |
(작성중) |
다음의 유틸리티 개체가 있습니다.
항목 | 내용 |
---|---|
slice |
(작성중) |
slice_array |
(작성중) |
gslice |
(작성중) |
gslice_array |
(작성중) |
mask_array |
(작성중) |
indirect_array |
(작성중) |
slice |
(작성중) |
공통 수학 함수
항목 | 내용 |
---|---|
abs() labs() llabs() (C++11~) |
(작성중) |
div() ldiv() lldev() (C++11~) |
(작성중) |
imaxabs() (C++11~) |
(작성중) |
imaxdiv() (C++11~) |
(작성중) |
fabs() fabsf(), fabsl (C++11~) |
(작성중) |
fmod() fmodf(), fmodl() (C++11~) |
(작성중) |
remainder(), remainderf(), remainderl() (C++11~) |
(작성중) |
remquo(), remquof(), remquol() (C++11~) |
(작성중) |
fma(), fmaf(), fmal() (C++11~) |
(작성중) |
fmax(), fmaxf(), fmaxl() (C++11~) |
(작성중) |
fmin(), fminf(), fminl() (C++11~) |
(작성중) |
fdim(), fdimf(), fdiml() (C++11~) |
(작성중) |
nan(), nanf(), nanl() (C++11~) |
(작성중) |
지수 함수
항목 | 내용 |
---|---|
exp() expf(), expl() (C++11~) |
(작성중) |
exp2(), exp2f(), exp2l() (C++11~) |
(작성중) |
expm1(), expm1f(), expm1l() (C++11~) |
(작성중) |
log() logf(), logl() (C++11~) |
(작성중) |
log10() log10f(), log10l() (C++11~) |
(작성중) |
log2(), log2f(), log2l() (C++11~) |
(작성중) |
log1p(), log1pf(), log1pl() (C++11~) |
(작성중) |
거듭 제곱 함수
항목 | 내용 |
---|---|
pow() powf(), powl() (C++11~) |
(작성중) |
sqrt() sqrtf(), sqrtl() (C++11~) |
(작성중) |
cbrt(), cbrtf(), cbrtl() (C++11~) |
(작성중) |
hypot(x, y), hypotf(), hypotl() (C++11~) |
sqrt(x^2 + y^2) 을 계산합니다. |
삼각 함수
항목 | 내용 |
---|---|
sin() sinf(), sinl() (C++11~) |
(작성중) |
cos() cosf(), cosl() (C++11~) |
(작성중) |
tan() tanf(), tanl() (C++11~) |
(작성중) |
asin() asinf(), asinl() (C++11~) |
(작성중) |
acos() acosf(), acosl() (C++11~) |
(작성중) |
atan() atanf(), atanl() (C++11~) |
(작성중) |
atan2() atan2f(), atan2l() (C++11~) |
(작성중) |
sinh() sinhf(), sinhl() (C++11~) |
(작성중) |
cosh() coshf(), coshl() (C++11~) |
(작성중) |
tanh() tanhf(), tanhl() (C++11~) |
(작성중) |
asinh(), asinhf(), asinhl() (C++11~) |
(작성중) |
acosh(), acoshf(), acoshl() (C++11~) |
(작성중) |
atanh(), atanhf(), atanhl() (C++11~) |
(작성중) |
(C++11~) 에러 및 감마 함수
항목 | 내용 |
---|---|
erf(), erff(), erfl() (C++11~) |
(작성중) |
erfc(), erfcf(), erfcl() (C++11~) |
(작성중) |
tgamma(), tgammaf(), tgammal() (C++11~) |
(작성중) |
lgamma(), lgammaf(), lgammal() (C++11~) |
(작성중) |
부동 소수점 함수
항목 | 내용 |
---|---|
ceil() ceilf(), ceill() (C++11~) |
(작성중) |
floor() floorf(), floorl() (C++11~) |
(작성중) |
trunc(), truncf(), truncl() (C++11~) |
(작성중) |
round(), roundf(), roundl(), lround(), lroundf(), lroundl(), llround(), llroundf(), llroundl() (C++11~) |
(작성중) |
nearbyint(), nearbyintf(), nearbyintl() (C++11~) |
(작성중) |
rint(), rintf(), rintl(), lrint(), lrintf(), lrintl(), llrint(), llrintf(), llrintl() (C++11~) |
(작성중) |
frexp() frexpf(), frexpl() (C++11~) |
(작성중) |
ldexp() ldexpf(), ldexpl() (C++11~) |
(작성중) |
modf() modff(), modfl() (C++11~) |
(작성중) |
scalbn(), scalbnf(), scalbnl(), scalbln(), scalblnf(), scalblnl() (C++11~) |
(작성중) |
ilogb(), ilogbf(), ilogbl() (C++11~) |
(작성중) |
logb(), logbf(), logbl() (C++11~) |
(작성중) |
nextafter(), nextafterf(), nextafterl(),nexttoward(), nexttowardf(), nexttowardl() (C++11~) |
(작성중) |
copysign(), copysignf(), copysignl() (C++11~) |
(작성중) |
(C++11~) 분류 및 비교 함수
항목 | 내용 |
---|---|
fpclassify() (C++11~) |
(작성중) |
isfinite() (C++11~) |
(작성중) |
isinf() (C++11~) |
(작성중) |
isnan() (C++11~) |
(작성중) |
signbit() (C++11~) |
(작성중) |
isgreater() (C++11~) |
(작성중) |
isgreaterequal() (C++11~) |
(작성중) |
isless() (C++11~) |
(작성중) |
islessequal() (C++11~) |
(작성중) |
islessgreater() (C++11~) |
(작성중) |
isunordered() (C++11~) |
(작성중) |
islessgreater() (C++11~) |
(작성중) |
(C++11~) 매크로 상수
항목 | 내용 |
---|---|
HUGE_VALF, HUGE_VAL, HUGE_VALL (C++11~) |
(작성중) |
INFINITY (C++11~) |
(작성중) |
NAN (C++11~) |
(작성중) |
math_errhandling, MATH_ERRNO, MATH_ERREXCEPT (C++11~) |
(작성중) |
FP_NORMAL, FP_SUBNORMAL, FP_ZERO, FP_INFINITE, FP_NAN (C++11~) |
(작성중) |
(C++11~) 부동 소수점 환경
항목 | 내용 |
---|---|
feclearexcept() (C++11~) |
(작성중) |
fetestexcept() (C++11~) |
(작성중) |
feraiseexcept() (C++11~) |
(작성중) |
fegetexceptflag(), fesetexceptflag() (C++11~) |
(작성중) |
fegetround(), fesetround() (C++11~) |
(작성중) |
fegetenv(), fesetenv() (C++11~) |
(작성중) |
FE_ALL_EXCEPT, FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW (C++11~) |
(작성중) |
FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD (C++11~) |
(작성중) |
FE_DFL_ENV (C++11~) |
(작성중) |
(C++17~) 특수 수학 함수
항목 | 내용 |
---|---|
assoc_laguerre(), assoc_laguerref(), assoc_laguerrel() (C++17~) |
(작성중) |
assoc_legendre(), assoc_legendref(), assoc_legendrel() (C++17~) |
(작성중) |
beta, betaf, betal (C++17~) |
(작성중) |
comp_ellint_1(), comp_ellint_1f(), comp_ellint_1l() (C++17~) |
(작성중) |
comp_ellint_2(), comp_ellint_2f(), comp_ellint_2l() (C++17~) |
(작성중) |
comp_ellint_3(), comp_ellint_3f(), comp_ellint_3l() (C++17~) |
(작성중) |
cyl_bessel_i(), cyl_bessel_if(), cyl_bessel_il() (C++17~) |
(작성중) |
cyl_bessel_j(), cyl_bessel_jf(), cyl_bessel_jl() (C++17~) |
(작성중) |
cyl_bessel_k(), cyl_bessel_kf(), cyl_bessel_kl() (C++17~) |
(작성중) |
cyl_neumann(), cyl_neumannf(), cyl_neumannl() (C++17~) |
(작성중) |
ellint_1(), ellint_1f(), ellint_1l() (C++17~) |
(작성중) |
ellint_2(), ellint_2f(), ellint_2l() (C++17~) |
(작성중) |
ellint_3(), ellint_3f(), ellint_3l() (C++17~) |
(작성중) |
expint(), expintf(), expintl() (C++17~) |
(작성중) |
hermite(), hermitef(), hermitel() (C++17~) |
(작성중) |
legendre(), legendref(), legendrel() (C++17~) |
(작성중) |
laguerre(), laguerref(), laguerrel() (C++17~) |
(작성중) |
riemann_zeta(), riemann_zetaf(), riemann_zetal() (C++17~) |
(작성중) |
sph_bessel(), sph_besself(), sph_bessell() (C++17~) |
(작성중) |
sph_legendre(), sph_legendref(), sph_legendrel() (C++17~) |
(작성중) |
sph_neumann(), sph_neumannf(), sph_neumannl() (C++17~) |
(작성중) |
(C++20~) 수학 상수
항목 | 내용 |
---|---|
e_v (C++20~) | 오일러 수 |
log2e_v (C++20~) | |
log10e_v (C++20~) | |
pi_v (C++20~) | 파이 |
inv_pi_v (C++20~) |
|
inv_sqrtpi_v (C++20~) |
|
ln2_v (C++20~) |
|
ln10_v (C++20~) |
|
sqrt2_v (C++20~) |
|
sqrt3_v (C++20~) |
|
inv_sqrt3_v (C++20~) |
|
egamma_v (C++20~) |
오일러 상수 |
phi_v (C++20~) |
황금 비율 |
(C++20~) 비트 조작
항목 | 내용 |
---|---|
bit_cast() (C++20~) |
비트 단위로 reinterpret_cast를 합니다. |
has_single_bit() (C++20~) |
2의 거듭제곱인지 검사합니다. |
bit_ceil() (C++20~) |
주어진 수를 올림한 2의 거듭 제곱입니다. |
bit_floor() (C++20~) |
주어진 수를 내림한 2의 거듭 제곱입니다. |
bit_width() (C++20~) |
주어진 수를 저장할 수 있는 비트 개수입니다. |
rotl() (C++20~) |
비트를 왼쪽으로 회전합니다. |
rotr() (C++20~) |
비트를 오른쪽으로 회전합니다. |
countl_zero() (C++20~) |
왼쪽 비트에서 연속된 0 의 갯수입니다. |
countl_one() (C++20~) |
왼쪽 비트에서 연속된 1 의 갯수입니다. |
countr_zero() (C++20~) |
오른쪽 비트에서 연속된 0 의 갯수입니다. |
countr_one() (C++20~) |
오른쪽 비트에서 연속된 1 의 갯수입니다. |
popcount() (C++20~) |
1 의 갯수 입니다. |
endian (C++20~) |
현 플랫폼의 바이트 저장 순서입니다. * little : 리틀 엔디안 입니다. 낮은 주소에 하위 바이트를 저장합니다.(Windows)* big : 빅 엔디안 입니다. 낮은 주소에 상위 바이트를 저장합니다.(Linux 등)* native : 플랫폼이 리틀 엔디안을 사용하면 litte 이고, 빅 엔디안을 사용하면 big 입니다. |
byteswap() (C++23~) |
주어진 정수값의 바이트를 뒤집습니다. |
다음은 비트 조작의 예입니다. 입력값으로 부호 없는 정수값을 사용하여야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 2의 거듭 제곱인지 검사합니다. 이때 부호없는 정수를 사용해야 합니다.
static_assert(std::has_single_bit(0u) == false);
static_assert(std::has_single_bit(1u) == true); // 2^0
static_assert(std::has_single_bit(2u) == true); // 2^1
static_assert(std::has_single_bit(3u) == false);
static_assert(std::has_single_bit(4u) == true); // 2^2
static_assert(std::bit_ceil(3u) == 4); // 주어진 수를 올림한 2의 거듭 제곱입니다.
static_assert(std::bit_floor(3u) == 2); // 주어진 수를 내림한 2의 거듭 제곱입니다.
static_assert(std::bit_width(0b00000011u) == 2); // 주어진 수를 저장할 수 있는 비트 개수입니다.
static_assert(std::rotl(static_cast<std::uint8_t>(0b10000110u), 2) == 0b00011010); // 비트를 왼쪽으로 회전합니다.
static_assert(std::rotr(static_cast<std::uint8_t>(0b10000110u), 2) == 0b10100001); // 비트를 오른쪽으로 회전합니다.
static_assert(std::countl_zero(static_cast<std::uint8_t>(0b00110000u)) == 2); // 왼쪽 비트에서 연속된 0의 갯수입니다.
static_assert(std::countl_one(static_cast<std::uint8_t>(0b11110000u)) == 4); // 왼쪽 비트에서 연속된 1의 갯수입니다.
static_assert(std::countr_zero(static_cast<std::uint8_t>(0b00110000u)) == 4); // 오른쪽 비트에서 연속된 0의 갯수입니다.
static_assert(std::countr_one(static_cast<std::uint8_t>(0b00110011u)) == 2); // 오른쪽 비트에서 연속된 1의 갯수입니다.
static_assert(std::popcount(0b00110011u) == 4); // 1의 갯수 입니다.
다음은 4byte인 uint32_t의 endian에 따른 저장 방식을 확인한 예입니다. 리틀 엔디안의 경우 4byte가 반전되어 저장된 것을 확인할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
union Test {
std::uint32_t byte4; // 4byte 정수
std::uint8_t byte[4]; // 1byte
};
Test test;
test.byte4 = 0x48abcdef; // 4바이트로 저장시
EXPECT_TRUE(test.byte4 == 0x48abcdef);
if constexpr(std::endian::native == std::endian::little) {
EXPECT_TRUE(test.byte[0] == 0xef); // 낮은 주소에 4바이트중 하위 바이트를 저장합니다.
EXPECT_TRUE(test.byte[1] == 0xcd);
EXPECT_TRUE(test.byte[2] == 0xab);
EXPECT_TRUE(test.byte[3] == 0x48);
}
else {
EXPECT_TRUE(test.byte[0] == 0x48); // 낮은 주소에 상위 바이트를 저장합니다.
EXPECT_TRUE(test.byte[1] == 0xab);
EXPECT_TRUE(test.byte[2] == 0xcd);
EXPECT_TRUE(test.byte[3] == 0xef);
}
다음은 2byte인 uint16_t의 endian에 따른 저장 방식을 확인한 예입니다. 리틀 엔디안의 경우 2byte가 반전되어 저장된 것을 확인할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
union Test {
std::uint16_t byte2[2]; // 2byte 정수
std::uint8_t byte[4]; // 1byte
};
Test test;
test.byte2[0] = 0x48ab; // 2바이트로 저장시
test.byte2[1] = 0xcdef;
EXPECT_TRUE(test.byte2[0] == 0x48ab);
EXPECT_TRUE(test.byte2[1] == 0xcdef);
if constexpr(std::endian::native == std::endian::little) {
EXPECT_TRUE(test.byte[0] == 0xab); // 낮은 주소에 2바이트중 하위 바이트를 저장합니다.
EXPECT_TRUE(test.byte[1] == 0x48);
EXPECT_TRUE(test.byte[2] == 0xef); // 낮은 주소에 2바이트중 하위 바이트를 저장합니다.
EXPECT_TRUE(test.byte[3] == 0xcd);
}
else {
EXPECT_TRUE(test.byte[0] == 0x48); // 낮은 주소에 상위 바이트를 저장합니다.
EXPECT_TRUE(test.byte[1] == 0xab);
EXPECT_TRUE(test.byte[2] == 0xcd);
EXPECT_TRUE(test.byte[3] == 0xef);
}
C스타일 난수 생성기
항목 | 내용 |
---|---|
rand() |
(작성중) |
srand() |
(작성중) |
RAND_MAX |
(작성중) |
(C++11~) 난수 생성기
항목 | 내용 |
---|---|
uniform_random_bit_generator (C++11~) |
(작성중) |
linear_congruential_engine (C++11~) |
(작성중) |
mersenne_twister_engine (C++11~) |
(작성중) |
subtract_with_carry_engine (C++11~) |
(작성중) |
discard_block_engine (C++11~) |
(작성중) |
independent_bits_engine (C++11~) |
(작성중) |
shuffle_order_engine (C++11~) |
(작성중) |
random_device (C++11~) |
(작성중) |
다음 알고리즘은 미리 정의되었습니다.
항목 | 내용 |
---|---|
minstd_rand0 (C++11~) |
(작성중) |
minstd_rand (C++11~) |
(작성중) |
mt19937 (C++11~) |
(작성중) |
mt19937_64 (C++11~) |
(작성중) |
ranlux24_base (C++11~) |
(작성중) |
ranlux48_base (C++11~) |
(작성중) |
ranlux24 (C++11~) |
(작성중) |
ranlux48 (C++11~) |
(작성중) |
knuth_b (C++11~) |
(작성중) |
default_random_engine (C++11~) |
(작성중) |
유틸리티
항목 | 내용 |
---|---|
generate_canonical (C++11~) |
(작성중) |
seed_seq (C++11~) |
(작성중) |
균일 분포
항목 | 내용 |
---|---|
uniform_int_distribution (C++11~) |
(작성중) |
uniform_real_distribution (C++11~) |
(작성중) |
베르누이 분포
항목 | 내용 |
---|---|
bernoulli_distribution (C++11~) |
(작성중) |
binomial_distribution (C++11~) |
(작성중) |
negative_binomial_distribution (C++11~) |
(작성중) |
geometric_distribution (C++11~) |
(작성중) |
포아송 분포
항목 | 내용 |
---|---|
poisson_distribution (C++11~) |
(작성중) |
exponential_distribution (C++11~) |
(작성중) |
gamma_distribution (C++11~) |
(작성중) |
weibull_distribution (C++11~) |
(작성중) |
extreme_value_distribution (C++11~) |
(작성중) |
정규 분포
항목 | 내용 |
---|---|
normal_distribution (C++11~) |
(작성중) |
lognormal_distribution (C++11~) |
(작성중) |
chi_squared_distribution (C++11~) |
(작성중) |
cauchy_distribution (C++11~) |
(작성중) |
fisher_f_distribution (C++11~) |
(작성중) |
student_t_distribution (C++11~) |
(작성중) |
표본 분포
항목 | 내용 |
---|---|
discrete_distribution (C++11~) |
(작성중) |
piecewise_constant_distribution (C++11~) |
(작성중) |
piecewise_linear_distribution (C++11~) |
(작성중) |
댓글남기기