std::midpoint
De cppreference.com
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
Ejecuta este código
#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) |