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ștestd::midpoint(st, dr)saust + (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.