i32::abs în Rust

abs() dă valoarea absolută (fără semn); signum() dă -1, 0 sau 1 după semnul numărului.

Sintaxă
const fn abs(self) -> i32
const fn signum(self) -> i32
const fn unsigned_abs(self) -> u32

Ce face i32::abs

x.abs() returnează distanța față de zero: (-5).abs() == 5. Există o singură excepție: i32::MIN.abs() nu încape în i32 (ar fi 2147483648), deci în debug intră în panică. unsigned_abs() returnează un u32 și merge pentru orice valoare; checked_abs() dă None pentru MIN.

x.signum() returnează -1 pentru numere negative, 0 pentru zero și 1 pentru numere pozitive. Este util pentru a afla direcția unei schimbări.

Ce returnează

abs și signum: i32. unsigned_abs: u32.

Exemple

Exemplul 1: Diferența de temperatură

fn main() {
    let temperaturi: [(&str, i32); 4] = [("Iași", -3), ("Cluj", 2), ("Constanța", 7), ("Brașov", -8)];
    for (oras, t) in temperaturi {
        let directie = match t.signum() {
            -1 => "sub zero",
            0 => "exact zero",
            _ => "peste zero",
        };
        println!("{oras}: {} grade {directie}", t.abs());
    }
    let dif = (temperaturi[2].1 - temperaturi[3].1).abs();
    println!("diferența Constanța-Brașov: {dif} grade");
}

Rezultat

Iași: 3 grade sub zero
Cluj: 2 grade peste zero
Constanța: 7 grade peste zero
Brașov: 8 grade sub zero
diferența Constanța-Brașov: 15 grade

Exemplul 2: Cazul i32::MIN

fn main() {
    println!("MIN = {}", i32::MIN);
    println!("checked_abs: {:?}", i32::MIN.checked_abs());
    println!("unsigned_abs: {}", i32::MIN.unsigned_abs());
    println!("wrapping_abs: {}", i32::MIN.wrapping_abs());
    println!("signum(0) = {}", 0_i32.signum());
}

Rezultat

MIN = -2147483648
checked_abs: None
unsigned_abs: 2147483648
wrapping_abs: -2147483648
signum(0) = 0

Greșeli frecvente

  • Aplici abs() pe i32::MIN (de exemplu un rezultat venit din calcule): panică în debug. Folosește unsigned_abs().
  • Scrii (a - b).abs() cu a și b de tip u32: tipurile fără semn nu au abs, iar scăderea poate da depășire. Folosește a.abs_diff(b).

Comenzi înrudite

  • f64::abs: Valoarea absolută a unui număr zecimal: elimină semnul minus.
  • i32::rem_euclid: Restul împărțirii care este mereu pozitiv (sau zero), spre deosebire de %, care păstrează semnul.
  • i32: Tipul implicit pentru numere întregi cu semn, pe 32 de biți: de la -2147483648 la 2147483647.