std::fmin în C++

Returnează minimul (fmin) sau maximul (fmax) a două numere cu virgulă, ignorând o valoare NaN.

Sintaxă
double fmin(double x, double y);
double fmax(double x, double y);

Ce face std::fmin

std::fmin și std::fmax sunt variantele din <cmath> pentru numere cu virgulă. Diferența față de std::min/std::max: dacă unul dintre argumente este NaN, returnează celălalt argument. std::min ar returna un rezultat care depinde de ordinea argumentelor.

Acceptă și tipuri amestecate (de exemplu int și double), pe care le convertește la double.

Parametri

Parametru Descriere
x, y Cele două numere.

Ce returnează

Minimul sau maximul, ca double.

Exemple

Exemplul 1: Valori normale și NaN

#include <algorithm>
#include <cmath>
#include <limits>
#include <print>

int main() {
    double nan = std::numeric_limits<double>::quiet_NaN();

    std::println("fmin(2.5, 1.5) = {}", std::fmin(2.5, 1.5));
    std::println("fmax(3, 7.25)  = {}", std::fmax(3, 7.25));
    std::println("fmin(nan, 4)   = {}", std::fmin(nan, 4.0));
    std::println("std::min(nan, 4.0) = {}, std::min(4.0, nan) = {}", std::min(nan, 4.0), std::min(4.0, nan));
}

Rezultat

fmin(2.5, 1.5) = 1.5
fmax(3, 7.25)  = 7.25
fmin(nan, 4)   = 4
std::min(nan, 4.0) = nan, std::min(4.0, nan) = 4

Exemplul 2: Senzor cu citiri lipsă

Citirile lipsă sunt NaN; fmax le ignoră.

#include <cmath>
#include <limits>
#include <print>
#include <vector>

int main() {
    double lipsa = std::numeric_limits<double>::quiet_NaN();
    std::vector<double> citiri{21.5, lipsa, 23.75, 22.0, lipsa};

    double maxim = lipsa;
    for (double c : citiri) {
        maxim = std::fmax(maxim, c);
    }
    std::println("Temperatura maximă: {:.2f}", maxim);
}

Rezultat

Temperatura maximă: 23.75

Greșeli frecvente

  • Folosești std::max pe date care pot conține NaN: rezultatul depinde de ordinea argumentelor și poate fi NaN.

Comenzi înrudite

  • std::min: Returnează cea mai mică dintre două valori sau dintr-o listă de valori scrisă între acolade.
  • std::max: Returnează cea mai mare dintre două valori sau dintr-o listă de valori scrisă între acolade.
  • std::isnan: Verifică dacă un număr cu virgulă este NaN (rezultat nedefinit) sau infinit (inf).
  • std::clamp: Limitează o valoare la un interval: o aduce la minim dacă e prea mică și la maxim dacă e prea mare.