476 단어
2 분
부동소수점 타입

타입 종류#

f32 / f64

여기서 ffloating-point(부동소수점)를 의미하며, 뒤 숫자는 비트 크기를 나타냅니다.

  • f32: 32비트 부동소수점 (단정도, 약 7자리 십진수 정밀도)
  • f64: 64비트 부동소수점 (배정도, 약 15자리 십진수 정밀도)

Rust에서 기본 부동소수점 타입은 f64입니다.

예시#

main.rs
let a = 3.14; // 기본 f64로 추론
let b: f32 = 2.5; // 명시적으로 f32 지정
let c = 5f32; // 숫자 뒤에 타입 붙이기

부동소수점 특징#

정밀도#

f32보다 f64가 훨씬 더 많은 유효 숫자를 정확히 표현할 수 있습니다.

main.rs
let x: f32 = 1.123456789;
let y: f64 = 1.1234567890123456;
println!("{}", x); // 1.1234568 (정밀도 손실)
println!("{}", y); // 1.1234567890123457

특수 값#

부동소수점에는 정수형에는 없는 특별한 값이 있습니다.

main.rs
let nan = f64::NAN; // 숫자가 아님(Not a Number)
let inf = f64::INFINITY; // 양의 무한대
let ninf = f64::NEG_INFINITY; // 음의 무한대
assert!(nan.is_nan());
assert!(inf.is_infinite());

많이 쓰는 메서드#

powf#

수를 원하는 수로 거듭제곱합니다.

main.rs
assert_eq!(2f32.powf(3.0), 8.0);
assert_eq!(f64::powf(9.0, 0.5), 3.0);

sqrt#

제곱근을 구합니다.

main.rs
assert_eq!(9f64.sqrt(), 3.0);

round#

반올림합니다.

main.rs
assert_eq!(3.6f32.round(), 4.0);
assert_eq!(3.3f32.round(), 3.0);

floor / ceil#

  • floor: 내림
  • ceil: 올림
main.rs
assert_eq!(3.7f32.floor(), 3.0);
assert_eq!(3.3f32.ceil(), 4.0);

abs#

절댓값을 구합니다.

main.rs
assert_eq!((-5.5f64).abs(), 5.5);

is_nan#

값이 NaN(Not a Number)인지 확인합니다.

main.rs
let x = 0.0 / 0.0;
assert_eq!(x.is_nan(), true);

is_finite / is_infinite#

  • is_finite: 유한한 수인지 확인
  • is_infinite: 무한대인지 확인
main.rs
assert_eq!(5f64.is_finite(), true);
assert_eq!(f64::INFINITY.is_infinite(), true);

주의할 점#

  • 부동소수점은 완벽한 정확성이 보장되지 않습니다. (이진 부동소수점의 한계)
  • 비교할 때는 정확한 일치보다는 오차 허용 범위를 두는 것이 안전합니다.
main.rs
let a = 0.1f64 + 0.2f64;
assert!((a - 0.3).abs() < f64::EPSILON); // 안전한 비교