f64::clamp în Rust

Limitează valoarea la un interval: sub min devine min, peste max devine max, altfel rămâne neschimbată.

Sintaxă
fn clamp(self, min: f64, max: f64) -> f64

Ce face f64::clamp

x.clamp(min, max) este o scriere scurtă pentru x.max(min).min(max): dacă x este în interval, rămâne la fel; dacă iese, este adus la capătul cel mai apropiat. Este util pentru volume, procente, coordonate pe ecran, note.

Dacă min > max sau oricare dintre limite este NaN, metoda intră în panică. Dacă x este NaN, rezultatul este NaN. Întregii au aceeași metodă, clamp, prin trait-ul Ord.

Parametri

Parametru Descriere
min Limita de jos.
max Limita de sus; trebuie să fie cel puțin cât min.

Ce returnează

f64.

Exemple

Exemplul 1: Volum între 0 și 100

fn main() {
    let mut volum = 80.0_f64;
    for schimbare in [15.0, 10.0, -50.0, -70.0] {
        volum = (volum + schimbare).clamp(0.0, 100.0);
        println!("{schimbare:+} -> volum {volum}");
    }
    println!("NaN.clamp: {}", f64::NAN.clamp(0.0, 1.0));
    println!("pentru întregi: {}", 15_i32.clamp(1, 10));
}

Rezultat

+15 -> volum 95
+10 -> volum 100
-50 -> volum 50
-70 -> volum 0
NaN.clamp: NaN
pentru întregi: 10

Exemplul 2: Bară de progres

Raportul poate ieși din intervalul 0..1 dacă datele sunt greșite; clamp ține bara în limite.

fn bara(facut: f64, total: f64) -> String {
    let p = (facut / total).clamp(0.0, 1.0);
    let pline = (p * 20.0).round() as usize;
    format!("[{}{}] {:>3.0}%", "#".repeat(pline), "-".repeat(20 - pline), p * 100.0)
}

fn main() {
    println!("{}", bara(3.0, 12.0));
    println!("{}", bara(9.0, 12.0));
    println!("{}", bara(15.0, 12.0));
    println!("{}", bara(-2.0, 12.0));
}

Rezultat

[#####---------------]  25%
[###############-----]  75%
[####################] 100%
[--------------------]   0%

Greșeli frecvente

  • Inversezi limitele: x.clamp(100.0, 0.0) intră în panică (min > max).
  • Folosești clamp ca să ascunzi date greșite: dacă o valoare în afara intervalului este o eroare, semnaleaz-o.

Comenzi înrudite

  • f64::min: min returnează cel mai mic dintre două numere, max cel mai mare; dacă unul este NaN, îl ignoră.
  • i32::saturating_sub: Scade, dar se oprește la limita tipului în loc să depășească: i32::MIN.saturating_sub(1) rămâne i32::MIN.
  • f64::round: Rotunjiri: round la cel mai apropiat întreg, floor în jos, ceil în sus, trunc tăie zecimalele.