Espacios de nombres
Variantes
Acciones

std::midpoint

De cppreference.com
< cpp‎ | numeric
 
 
 
Definido en el archivo de encabezado <numeric>
template< class T >
constexpr T midpoint(T a, T b) noexcept;
(1) (desde C++20)
template< class T >
constexpr T* midpoint(T* a, T* b);
(2) (desde C++20)

Calcula el punto medio de los valores enteros, de punto flotante o punteros a y b.

1) Esta sobrecarga solo participa en la resolución de sobrecargas si T es un tipo aritmético distinto de bool.
2) Esta sobrecarga solo participa en la resolución de sobrecargas si T es un tipo objeto. El uso de esta sobrecarga está mal formado si T es un tipo incompleto.

Contenido

[editar] Parámetros

a, b - Valores enteros, de punto flotante o punteros.

[editar] Valor de retorno

1) La mitad de la suma de a y b. No ocurre desbordamiento. Si a y b son de tipo entero y la suma es non, el resultado se redondea hacia a. Si a y b son de tipo flotante, como máximo ocurre una operación inexacta.
2) Si a y b apuntan a, respectivamente, x[i] y x[j] del mismo objeto array x (que para efectos de la aritmética de punteros), devuelve un puntero a x[i+(j-i)/2], o, de manera equivalente, x[std::midpoint(i, j)]) donde la división se redondea hacia cero. Si a y b no apuntan a elementos del mismo objeto array, el comportamiento está indefinido.

[editar] Excepciones

No lanza excepciones.

[editar] Notas

La sobrecarga (2) se puede implementar simplemente como return a + (b - a) / 2; en plataformas comunes. Sin embargo, no se garantiza que dicha implementación sea portátil, porque puede haber algunas plataformas en las que es posible crear un array con un número de elementos mayor que PTRDIFF_MAX y b - a puede resultar en comportamiento indefinido incluso si tanto b como a apuntan a elementos en el mismo array.

[editar] Ejemplo

#include <cstdint>
#include <limits>
#include <numeric>
#include <iostream>
 
int main()
{
    std::uint32_t a = std::numeric_limits<std::uint32_t>::max();
    std::uint32_t b = std::numeric_limits<std::uint32_t>::max() - 2;
 
    std::cout << "a: " << a << '\n'
              << "b: " << b << '\n'
              << "Incorrecto (desbordamiento): " << (a + b) / 2 << '\n'
              << "Correcto: " << std::midpoint(a, b) << "\n\n";
 
 
    auto on_pointers = [](int i, int j) {
        char const* text = "0123456789";
        char const* p = text + i;
        char const* q = text + j;
        std::cout << "std::midpoint('" << *p << "', '" << *q << "'): '"
                  << *std::midpoint(p, q) << "'\n";
    };
 
    on_pointers(2, 4);
    on_pointers(2, 5);
    on_pointers(5, 2);
    on_pointers(2, 6);
}

Salida:

a: 4294967295
b: 4294967293
Incorrecto (desbordamiento): 2147483646
Correcto: 4294967294
 
std::midpoint('2', '4'): '3'
std::midpoint('2', '5'): '3'
std::midpoint('5', '2'): '4'
std::midpoint('2', '6'): '4'

[editar] Referencias

  • El estándar C++20 (ISO/IEC 14882:2020):
  • 25.10.15 Midpoint [numeric.ops.midpoint]

[editar] Véase también

(C++20)
Función de interpolación lineal
(función) [editar]