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로 계산을 최적화하고 정확성을 확보하세요!