std::midpoint în C++

Calculează mijlocul dintre două numere (sau pointeri) fără risc de depășire a limitei tipului.

Sintaxă
constexpr T midpoint(T a, T b) noexcept;
constexpr T* midpoint(T* a, T* b);

Ce face std::midpoint

Formula clasică (a + b) / 2 poate depăși limita lui int când a și b sunt mari. std::midpoint(a, b) din <numeric> calculează mijlocul corect pentru orice valori.

Pentru întregi, dacă suma este impară, rezultatul este rotunjit spre a (primul argument). Pentru numere cu virgulă, rezultatul este exact jumătatea.

Parametri

Parametru Descriere
a, b Două numere de același tip, sau doi pointeri în același tablou.

Ce returnează

Valoarea de la mijloc.

Exemple

Exemplul 1: Fără depășire

Suma celor două numere nu încape în int; midpoint dă totuși rezultatul corect. (Calculul greșit nu este rulat: depășirea unui int este comportament nedefinit.)

#include <limits>
#include <numeric>
#include <print>

int main() {
    int a = std::numeric_limits<int>::max() - 10;
    int b = std::numeric_limits<int>::max() - 2;

    std::println("a = {}, b = {}", a, b);
    std::println("Mijloc: {}", std::midpoint(a, b));
}

Rezultat

a = 2147483637, b = 2147483645
Mijloc: 2147483641

Exemplul 2: Rotunjire spre primul argument

#include <numeric>
#include <print>

int main() {
    std::println("midpoint(3, 8) = {}", std::midpoint(3, 8));
    std::println("midpoint(8, 3) = {}", std::midpoint(8, 3));
    std::println("midpoint(3.0, 8.0) = {}", std::midpoint(3.0, 8.0));
}

Rezultat

midpoint(3, 8) = 5
midpoint(8, 3) = 6
midpoint(3.0, 8.0) = 5.5

Greșeli frecvente

  • Scrii (st + dr) / 2 în căutarea binară pe indici mari. Folosește std::midpoint(st, dr) sau st + (dr - st) / 2.

Comenzi înrudite

  • std::lerp: Interpolare liniară: valoarea aflată la fracțiunea t pe drumul dintre a și b (a + t·(b − a)).
  • std::binary_search: Verifică foarte rapid dacă o valoare există într-un interval deja sortat.
  • std::nth_element: Pune pe poziția n elementul care ar fi acolo după sortare; util pentru mediană sau al k-lea cel mai mic.