E.V.E
v2023.02.15
Loading...
Searching...
No Matches

◆ lpnorm

auto eve::lpnorm = functor<lpnorm_t>
inlineconstexpr

Defined in Header

#include <eve/module/math.hpp>

Callable Signatures

namespace eve
{
// Regular overload
constexpr auto lpnorm(value auto p, floating_value auto... xs ) noexcept; // 1
constexpr auto lpnorm(value auto p, non_empty_product_type tup) noexcept; // 2
// Lanes masking
constexpr auto lpnorm[conditional_expr auto c](value auto p, floating_value auto... xs) noexcept; // 3
constexpr auto lpnorm[logical_value auto m](value auto p,floating_value auto... xs) noexcept; // 3
// Semantic options
constexpr auto lpnorm[pedantic](/* any of the above overloads */) noexcept; // 4
constexpr auto lpnorm[widen](/* any of the above overloads */) noexcept; // 5
constexpr auto lpnorm[kahan](/* any of the above overloads */) noexcept; // 6
constexpr auto lpnorm[raw](/* any of the above overloads */) noexcept; // 7
}
Specifies that a type is a Conditional Expression.
Definition conditional.hpp:28
The concept floating_value<T> is satisfied if and only if T satisfies eve::value and the element type...
Definition value.hpp:116
The concept logical_value<T> is satisfied if and only if T satisfies eve::value and the element type ...
Definition value.hpp:134
The concept value<T> is satisfied if and only if T satisfies either eve::scalar_value or eve::simd_va...
Definition value.hpp:34
constexpr auto widen
Computes the result in the upgraded element type.
Definition core.hpp:106
constexpr auto raw
Performs the operation minimally, trading accuracy for speed.
Definition core.hpp:95
constexpr auto pedantic
Follows the corner cases of the corresponding standard function.
Definition core.hpp:91
constexpr auto lpnorm
strict_elementwise_callable object computing the lpnorm operation .
Definition lpnorm.hpp:95
EVE Main Namespace.
Definition abi.hpp:19

Parameters

Return value

  1. \( \left(\sum_{i = 0}^n |x_i|^p\right)^{\frac1p} \) and \( \max_{i = 0}^n |x_i|} \) if 'p' is infinite.
  2. same as 1. on the tuple elements.
  3. The operation is performed conditionally
  4. returns \(\infty\) as soon as after disabling possible Nan parameters the result is \(\infty\).
  5. The summation is computed in the double sized element type (if available).
  6. Kahan like compensated algorithm is used in internal summation for better precision (see add).
  7. This option is faster, but does not care about avoiding overflows or treating 'Nans' in special ways.

Example

#include <eve/module/math.hpp>
#include <eve/wide.hpp>
#include <iostream>
#include <iomanip>
int main()
{
wide_ft x = {eve::nan(eve::as<float>()), 1.0f, 1.0f, 1.0f};
wide_ft y = {-1.5f, 2.9f, 3.5f, -11.0f};
wide_ft z = { eve::inf(eve::as(1.0f)), -2.0f, 1.0f, eve::nan(eve::as<float>())};
wide_ft p = { 3.2f, 3.0f, 2.0f, eve::inf(eve::as(1.0f))};
std::cout << "---- simd" << std::setprecision(5) << '\n'
<< "<- p = " << p << '\n'
<< "<- x = " << x << '\n'
<< "<- y = " << y << '\n'
<< "<- z = " << z << '\n'
<< "-> lpnorm(p, x, y, z) = " << eve::lpnorm(p, x, y, z) << '\n'
<< "-> lpnorm[pedantic](p, x, y, z) = " << eve::lpnorm[eve::pedantic](p, x, y, z) << '\n'
;
double xf = 10.0;
double yf = 1.0;
double zf = 111.0;
double pf = 2.0;
std::cout << "---- scalar" << '\n'
<< "<- pf = " << pf << '\n'
<< "<- xf = " << xf << '\n'
<< "<- yf = " << yf << '\n'
<< "<- zf = " << zf << '\n'
<< "-> lpnorm(pf, xf, yf, zf) = " << eve::lpnorm(pf, xf, yf, zf) << '\n'
<< "-> lpnorm[pedantic](pf, xf, yf, zf) = " << eve::lpnorm[eve::pedantic](pf, xf, yf, zf) << '\n';
float o = 1.0f;
float i = eve::inf(eve::as(o));
float n = eve::nan(eve::as(o));
float ma= eve::valmax(eve::as(o));
float m = (ma/3)*2;
std::cout << "<- o = " << o << "\n";
std::cout << "-> i = " << i << "\n";
std::cout << "-> n = " << n << "\n";
std::cout << "-> lpnorm(3, i, o, -i) = " << eve::lpnorm(3, i, o, -i) << "\n";
std::cout << "-> lpnorm(3, i, o, n) = " << eve::lpnorm(3, i, o, n) << "\n";
std::cout << "-> lpnorm[pedantic](3, o, o, n) = " << eve::lpnorm[eve::pedantic](3, o, o, n) << "\n";
std::cout << "-> lpnorm[pedantic](3, o, n, o) = " << eve::lpnorm[eve::pedantic](3, o, n, o) << "\n";
std::cout << "-> lpnorm[pedantic](3, n, o, o) = " << eve::lpnorm[eve::pedantic](3, n, o, o) << "\n";
std::cout << "-> lpnorm[pedantic](3, n, m, m) = " << eve::lpnorm[eve::pedantic](3, n, m, m) << "\n";
std::cout << "-> lpnorm (3, o, o, n) = " << eve::lpnorm(3, o, o, n) << "\n";
std::cout << "-> lpnorm (3, o, n, o) = " << eve::lpnorm(3, o, n, o) << "\n";
std::cout << "-> lpnorm (3, n, o, o) = " << eve::lpnorm(3, n, o, o) << "\n";
std::cout << "-> lpnorm (3, n, m, m) = " << eve::lpnorm(3, n, m, m) << "\n";
std::cout << "-> lpnorm(3, n, n, n) = " << eve::lpnorm(3, n, n, n) << "\n";
std::cout << "-> lpnorm(3, m, o, o) = " << eve::lpnorm(3, m, o, o)<< "\n";
std::cout << "-> lpnorm[pedantic](3, m, o, o) = " << eve::lpnorm[eve::pedantic](3, m, o, o)<< "\n";
std::cout << "-> lpnorm[pedantic](3, i, o, n) = " << eve::lpnorm[eve::pedantic](3, i, o, n) << "\n";
std::cout << "-> lpnorm[pedantic](3, m) = " << eve::lpnorm[eve::pedantic](3, m) << "\n";
std::cout << "-> lpnorm[pedantic](3, m, m) = " << eve::lpnorm[eve::pedantic](3, m, m) << "\n";
std::cout << "-> lpnorm[pedantic](3, m, m, m) = " << eve::lpnorm[eve::pedantic](3, m, m, m) << "\n";
std::cout << "-> lpnorm[pedantic](3, m, m, m, m) = " << eve::lpnorm[eve::pedantic](3, m, m, m, m) << "\n";
std::cout << "-> lpnorm[pedantic](3, m, o, o) = " << eve::lpnorm[eve::pedantic](3, m, o, o)<< "\n";
std::cout << "-> lpnorm(3, i, o, n) = " << eve::lpnorm(3, i, o, n) << "\n";
std::cout << "-> lpnorm(3, m) = " << eve::lpnorm(3, m) << "\n";
std::cout << "-> lpnorm(3, m, m) = " << eve::lpnorm(3, m, m) << "\n";
std::cout << "-> lpnorm(3, m, m, m) = " << eve::lpnorm(3, m, m, m) << "\n";
std::cout << "-> lpnorm(3, m, m, m, m) = " << eve::lpnorm(3, m, m, m, m) << "\n";
std::cout << "-> lpnorm[pedantic](3, m, n) = " << eve::lpnorm[eve::pedantic](3, m, n) << "\n";
std::cout << "-> lpnorm[pedantic](3, m, m, n) = " << eve::lpnorm[eve::pedantic](3, m, m, n) << "\n";
std::cout << "-> lpnorm[pedantic](3, m, m, m, n) = " << eve::lpnorm[eve::pedantic](3, m, m, m, n) << "\n";
std::cout << "-> lpnorm[pedantic](3, m, m, m, m, n) = " << eve::lpnorm[eve::pedantic](3, m, m, m, m, n) << "\n";
std::cout << "-> lpnorm(i, m) = " << eve::lpnorm(i, m) << "\n";
std::cout << "-> lpnorm(i, m, m) = " << eve::lpnorm(i, m, m) << "\n";
std::cout << "-> lpnorm(i, m, m, m) = " << eve::lpnorm(i, m, m, m) << "\n";
std::cout << "-> lpnorm(i, m, m, m, m) = " << eve::lpnorm(i, m, m, m, m) << "\n";
std::cout << "-> lpnorm[pedantic](i, m, n) = " << eve::lpnorm[eve::pedantic](i, m, n) << "\n";
std::cout << "-> lpnorm[pedantic](i, m, m, n) = " << eve::lpnorm[eve::pedantic](i, m, m, n) << "\n";
std::cout << "-> lpnorm[pedantic](i, m, m, m, n) = " << eve::lpnorm[eve::pedantic](i, m, m, m, n) << "\n";
std::cout << "-> lpnorm[pedantic](i, m, m, m, m, n) = " << eve::lpnorm[eve::pedantic](i, m, m, m, m, n) << "\n";
std::cout << "-> lpnorm[raw](3, m) = " << eve::lpnorm[eve::raw](3, m) << "\n";
std::cout << "-> lpnorm[raw](3, m, m) = " << eve::lpnorm[eve::raw](3, m, m) << "\n";
std::cout << "-> lpnorm[raw](3, m, m, m) = " << eve::lpnorm[eve::raw](3, m, m, m) << "\n";
std::cout << "-> lpnorm[raw](3, m, m, m, m) = " << eve::lpnorm[eve::raw](3, m, m, m, m) << "\n";
return 0;
}
constexpr auto nan
Computes the IEEE quiet NaN constant.
Definition nan.hpp:67
constexpr auto valmax
Computes the greatest representable value.
Definition valmax.hpp:67
constexpr auto inf
Computes the infinity ieee value.
Definition inf.hpp:67
Lightweight type-wrapper.
Definition as.hpp:29
Wrapper for SIMD registers.
Definition wide.hpp:94