pub struct Rational { /* private fields */ }Expand description
A rational number represented as a fraction (numerator / denominator).
This type is commonly used to represent:
- Time bases (e.g., 1/90000 for MPEG-TS, 1/1000 for milliseconds)
- Frame rates (e.g., 30000/1001 for 29.97 fps)
- Aspect ratios (e.g., 16/9)
§Invariants
- Denominator is always positive (sign is in numerator)
- Zero denominator is handled gracefully (returns infinity/NaN for conversions)
§Examples
use ff_format::Rational;
// Common time base for MPEG-TS
let time_base = Rational::new(1, 90000);
// 29.97 fps (NTSC)
let fps = Rational::new(30000, 1001);
assert!((fps.as_f64() - 29.97).abs() < 0.01);
// Invert to get frame duration
let frame_duration = fps.invert();
assert_eq!(frame_duration.num(), 1001);
assert_eq!(frame_duration.den(), 30000);Implementations§
Source§impl Rational
impl Rational
Sourcepub const fn new(num: i32, den: i32) -> Rational
pub const fn new(num: i32, den: i32) -> Rational
Creates a new rational number.
The denominator is normalized to always be positive (the sign is moved to the numerator).
§Panics
Does not panic. A zero denominator is allowed but will result in infinity or NaN when converted to floating-point.
§Examples
use ff_format::Rational;
let r = Rational::new(1, 2);
assert_eq!(r.num(), 1);
assert_eq!(r.den(), 2);
// Negative denominator is normalized
let r = Rational::new(1, -2);
assert_eq!(r.num(), -1);
assert_eq!(r.den(), 2);Sourcepub const fn zero() -> Rational
pub const fn zero() -> Rational
Creates a rational number representing zero (0/1).
§Examples
use ff_format::Rational;
let zero = Rational::zero();
assert_eq!(zero.as_f64(), 0.0);
assert!(zero.is_zero());Sourcepub const fn one() -> Rational
pub const fn one() -> Rational
Creates a rational number representing one (1/1).
§Examples
use ff_format::Rational;
let one = Rational::one();
assert_eq!(one.as_f64(), 1.0);Sourcepub const fn num(&self) -> i32
pub const fn num(&self) -> i32
Returns the numerator.
§Examples
use ff_format::Rational;
let r = Rational::new(3, 4);
assert_eq!(r.num(), 3);Sourcepub const fn den(&self) -> i32
pub const fn den(&self) -> i32
Returns the denominator.
The denominator is always non-negative.
§Examples
use ff_format::Rational;
let r = Rational::new(3, 4);
assert_eq!(r.den(), 4);Sourcepub fn as_f64(self) -> f64
pub fn as_f64(self) -> f64
Converts the rational number to a floating-point value.
Returns f64::INFINITY, f64::NEG_INFINITY, or f64::NAN for
edge cases (division by zero).
§Examples
use ff_format::Rational;
let r = Rational::new(1, 4);
assert_eq!(r.as_f64(), 0.25);
let r = Rational::new(1, 3);
assert!((r.as_f64() - 0.333333).abs() < 0.001);Sourcepub fn as_f32(self) -> f32
pub fn as_f32(self) -> f32
Converts the rational number to a single-precision floating-point value.
§Examples
use ff_format::Rational;
let r = Rational::new(1, 2);
assert_eq!(r.as_f32(), 0.5);Sourcepub const fn invert(self) -> Rational
pub const fn invert(self) -> Rational
Returns the inverse (reciprocal) of this rational number.
§Examples
use ff_format::Rational;
let r = Rational::new(3, 4);
let inv = r.invert();
assert_eq!(inv.num(), 4);
assert_eq!(inv.den(), 3);
// Negative values
let r = Rational::new(-3, 4);
let inv = r.invert();
assert_eq!(inv.num(), -4);
assert_eq!(inv.den(), 3);Sourcepub const fn is_zero(self) -> bool
pub const fn is_zero(self) -> bool
Returns true if this rational number is zero.
§Examples
use ff_format::Rational;
assert!(Rational::new(0, 1).is_zero());
assert!(Rational::new(0, 100).is_zero());
assert!(!Rational::new(1, 100).is_zero());Sourcepub const fn is_positive(self) -> bool
pub const fn is_positive(self) -> bool
Returns true if this rational number is positive.
§Examples
use ff_format::Rational;
assert!(Rational::new(1, 2).is_positive());
assert!(!Rational::new(-1, 2).is_positive());
assert!(!Rational::new(0, 1).is_positive());Sourcepub const fn is_negative(self) -> bool
pub const fn is_negative(self) -> bool
Returns true if this rational number is negative.
§Examples
use ff_format::Rational;
assert!(Rational::new(-1, 2).is_negative());
assert!(!Rational::new(1, 2).is_negative());
assert!(!Rational::new(0, 1).is_negative());