Rust의 std::f64
: 완벽 가이드
std::f64
는 Rust에서 64비트 부동소수점(floating-point) 숫자를 표현하기 위한 표준 라이브러리 모듈입니다. 이는 IEEE 754 표준을 기반으로 하며, 과학적 계산, 기계 학습, 물리 시뮬레이션 등 부동소수점 연산이 필요한 다양한 상황에서 사용됩니다. 이 글에서는 f64
의 주요 특징, 상수(const), 메서드, 예제와 함께 체계적으로 설명합니다.
1. f64
의 주요 특징
1.1 IEEE 754 기반
Rust의 f64
는 IEEE 754 표준을 준수합니다. 따라서 다음과 같은 부동소수점 관련 특성을 가집니다:
- 정확도: 64비트로 높은 정밀도를 제공.
- 부호(sign), 지수(exponent), **가수(mantissa)**로 숫자를 표현.
1.2 기본적인 범위와 표현
- 최대값 (
f64::MAX
):1.7976931348623157e+308
- 최소값 (
f64::MIN
):-1.7976931348623157e+308
- 양의 무한대 (
f64::INFINITY
):∞
- 음의 무한대 (
f64::NEG_INFINITY
):-∞
- NaN (Not a Number): 연산 결과가 정의되지 않을 때 사용 (
f64::NAN
).
1.3 지연된 계산 지원
f64
는 기본적으로 고성능 연산을 지원하며, 지연 계산(lazy evaluation)을 통해 필요할 때만 연산을 수행하도록 최적화되어 있습니다.
2. f64
의 주요 상수
Rust에서 f64
의 주요 상수는 다음과 같습니다:
상수 | 설명 | 값 |
---|---|---|
f64::DIGITS |
10진수 기준 유효 자릿수. | 15 |
f64::EPSILON |
1.0 과 구별할 수 있는 최소값. |
2.220446049250313e-16 |
f64::MAX |
표현 가능한 최대 값. | 1.7976931348623157e+308 |
f64::MIN |
표현 가능한 최소 값. | -1.7976931348623157e+308 |
f64::MIN_POSITIVE |
가장 작은 양수 값. | 2.2250738585072014e-308 |
f64::NAN |
숫자가 아닌 값을 나타냅니다. | NaN |
f64::INFINITY |
양의 무한대. | ∞ |
f64::NEG_INFINITY |
음의 무한대. | -∞ |
3. f64
메서드
Rust의 f64
는 다양한 메서드를 제공하여 부동소수점 연산을 간단히 처리할 수 있도록 합니다. 주요 메서드는 다음과 같습니다:
3.1 반올림 및 절대값 관련 메서드
abs
: 절대값 반환.
let x = -3.5_f64;
assert_eq!(x.abs(), 3.5);
round
: 가장 가까운 정수로 반올림.
let x = 3.7_f64;
assert_eq!(x.round(), 4.0);
floor
: 내림(가장 큰 정수 중 작은 값).
let x = 3.7_f64;
assert_eq!(x.floor(), 3.0);
ceil
: 올림(가장 작은 정수 중 큰 값).
let x = 3.2_f64;
assert_eq!(x.ceil(), 4.0);
3.2 지수 및 로그
exp
: 자연 상수e
의 거듭제곱.
let x = 1.0_f64;
assert_eq!(x.exp(), std::f64::consts::E);
ln
: 자연 로그 계산.
let x = std::f64::consts::E;
assert_eq!(x.ln(), 1.0);
log10
: 10을 밑으로 하는 로그.
let x = 100.0_f64;
assert_eq!(x.log10(), 2.0);
3.3 비교 연산
is_nan
: NaN인지 확인.
let x = std::f64::NAN;
assert!(x.is_nan());
is_infinite
: 값이 무한대인지 확인.
let x = std::f64::INFINITY;
assert!(x.is_infinite());
4. f64
활용 예제
4.1 물리 계산
let mass = 5.972e24; // 지구의 질량 (kg)
let gravity = 9.8; // 중력 가속도 (m/s^2)
let force = mass * gravity; // 뉴턴의 힘 공식
println!("Force: {:.2e} N", force);
4.2 과학적 데이터 분석
let data = [1.0, 2.0, 3.0, 4.0];
let mean: f64 = data.iter().sum::<f64>() / data.len() as f64;
println!("Mean: {}", mean);
4.3 기계 학습의 손실 함수
let predicted = [0.1, 0.9, 0.8];
let actual = [0.0, 1.0, 1.0];
let mse: f64 = predicted.iter()
.zip(actual.iter())
.map(|(p, a)| (p - a).powi(2))
.sum::<f64>() / predicted.len() as f64;
println!("Mean Squared Error: {}", mse);
5. f64
와 관련된 주의사항
1. NaN 처리: NaN은 모든 비교에서 false
를 반환하므로, 특별히 확인해야 합니다.
let x = std::f64::NAN; assert!(!x < 0.0); // 모든 비교가 false
2. 정확도 손실: 부동소수점 연산은 오차가 발생할 수 있으므로, 필요한 경우 EPSILON
값을 이용해 비교합니다.
let a = 0.1 + 0.2; let b = 0.3;
assert!((a - b).abs() < std::f64::EPSILON);
결론
Rust의 std::f64
는 고정밀도 계산과 부동소수점 연산의 강력한 도구로, 다양한 과학적, 수학적, 공학적 응용에서 널리 사용됩니다. 주요 상수, 메서드, 그리고 예제를 이해함으로써 f64
의 잠재력을 최대한 활용할 수 있습니다. Rust의 부동소수점 연산 도구인 f64
로 계산을 최적화하고 정확성을 확보하세요!