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

◆ sum_of_squares

auto eve::sum_of_squares = functor<sum_of_squares_t>
inlineconstexpr

Header file

#include <eve/module/core.hpp>

Callable Signatures

namespace eve
{
// Regular overloads
constexpr auto sum_of_squares(value auto x, value auto ... xs) noexcept; // 1
constexpr auto sum_of_squares(eve::non_empty_product_type auto const& tup) noexcept; // 2
// Semantic options
constexpr auto sum_of_squares[saturated](/*any of the above overloads*/) noexcept; // 3
constexpr auto sum_of_squares[pedantic](/*any of the above overloads*/) noexcept; // 4
constexpr auto sum_of_squares[kahan](/*any of the above overloads*/) noexcept; // 5
}
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 sum_of_squares
tuple_callable object computing the sum of the squared values of its arguments.
Definition sum_of_squares.hpp:90
constexpr auto saturated
Keeps the result inside the range of its type instead of wrapping or overflowing.
Definition core.hpp:104
constexpr auto pedantic
Follows the corner cases of the corresponding standard function.
Definition core.hpp:91
EVE Main Namespace.
Definition abi.hpp:19

Parameters

Return value

  1. The value of the sum of the squared values of the arguments is returned.
  2. equivalent to the call on the elements of the tuple.
  3. internally uses saturated options.
  4. returns \(\infty\) as soon as one of its parameter is infinite, regardless of possible Nan values.
  5. uses kahan like compensated algorithm for better accuracy.

Example

// revision 0
#include <eve/module/core.hpp>
#include <iostream>
#include <iomanip>
#include <cfenv>
#include <vector>
int main()
{
eve::wide wf0{1.0f, 1.0f, 2.0f, 3.0f, -1.0f, -2.0f, -3.0f, -4.0f};
eve::wide wf1{eve::eps(eve::as(1.0f))/4, -eve::eps(eve::as(1.0f))/4, 1.0f, -1.0f, 2.0f, -2.0f, 3.0f, -3.0f};
eve::wide wi0{0, 1, 2, 3, -1, -2, -3, -4};
eve::wide wi1{0, -4, 1, -1, 2, -2, 3, -3};
eve::wide<std::uint16_t, eve::fixed<8>> wu0{65534u, 65000u, 2u, 3u, 4u, 5u, 6u, 7u};
eve::wide<std::uint16_t, eve::fixed<8>> wu1{2u, 6u, 5u, 4u, 3u, 2u, 1u, 0u};
std::cout << std::setprecision(15) << "<- wf0 = " << wf0 << "\n";
std::cout << "<- wf1 = " << wf1 << "\n";
std::cout << "<- wi0 = " << wi0 << "\n";
std::cout << "<- wi1 = " << wi1 << "\n";
std::cout << "<- wu0 = " << wu0 << "\n";
std::cout << "<- wu1 = " << wu1 << "\n";
std::cout << "-> sum_of_squares(wf0, wf1) = " << eve::sum_of_squares(wf0, wf1) << "\n";
std::cout << "-> sum_of_squares[ignore_last(2)](wf0, wf1) = " << eve::sum_of_squares[eve::ignore_last(2)](wf0, wf1) << "\n";
std::cout << "-> sum_of_squares[wf0 != 0](wf0, wf1) = " << eve::sum_of_squares[wf0 != 0](wf0, wf1) << "\n";
std::cout << "-> sum_of_squares(wu0, wu1) = " << eve::sum_of_squares(wu0, wu1) << "\n";
std::cout << "-> sum_of_squares[saturated](wu0, wu1) = " << eve::sum_of_squares[eve::saturated](wu0, wu1) << "\n";
std::cout << "-> sum_of_squares(wi0, wi1) = " << eve::sum_of_squares(wi0, wi1) << "\n";
std::cout << std::setprecision(20) << "-> sum_of_squares[lower](wf0, wf1) = " << eve::sum_of_squares[eve::lower](wf0, wf1) << "\n";
std::cout << std::setprecision(20) << "-> sum_of_squares[upper](wf0, wf1) = " << eve::sum_of_squares[eve::upper](wf0, wf1) << "\n";
std::cout << std::setprecision(20) << "-> sum_of_squares[lower][strict](wf0, wf1) = " << eve::sum_of_squares[eve::lower][eve::strict](wf0, wf1) << "\n";
std::cout << std::setprecision(20) << "-> sum_of_squares[upper][strict](wf0, wf1) = " << eve::sum_of_squares[eve::upper][eve::strict](wf0, wf1) << "\n";
std::cout << "-> sum_of_squares(wu0, wu1) = " << eve::sum_of_squares(wu0, wu1) << "\n";
std::cout << "-> sum_of_squares[widen](wu0, wu1) = " << eve::sum_of_squares[eve::widen](wu0, wu1) << "\n";
std::cout << "-> sum_of_squares(wf0, wf1) = " << eve::sum_of_squares(wf0, wf1) << "\n";
std::cout << "-> sum_of_squares[widen](wf0, wf1) = " << eve::sum_of_squares[eve::widen](wf0, wf1) << "\n";
std::cout << std::setprecision(16);
auto sqteps_2 = eve::sqrteps(eve::as<float>())/2;
std::cout << "-> sum_of_squares(1.0f, sqteps_2, sqteps_2, sqteps_2, sqteps_2) = " << eve::sum_of_squares(1.0f, sqteps_2, sqteps_2, sqteps_2, sqteps_2) << "\n";
std::cout << "-> sum_of_squares[kahan](1.0f, sqteps_2, sqteps_2, sqteps_2, sqteps_2) = " << eve::sum_of_squares[eve::kahan](1.0f, sqteps_2, sqteps_2, sqteps_2, sqteps_2) << "// float result\n";
std::cout << "-> sum_of_squares[widen](1.0f, sqteps_2, sqteps_2, sqteps_2, sqteps_2) = " << eve::sum_of_squares[eve::widen](1.0f, sqteps_2, sqteps_2, sqteps_2, sqteps_2) << "// double result\n";
auto tup = kumi::tuple{1.0f, sqteps_2, sqteps_2, sqteps_2, sqteps_2};
std::cout << "-> sum_of_squares[kahan](tup) = " << eve::sum_of_squares[eve::kahan](tup) << "\n";
float o = 1.0f;
float i = eve::inf(eve::as(o));
float n = eve::nan(eve::as(o));
float v = eve::valmax(eve::as(o));
float z = eve::zero(eve::as(o));
float m = (v/3)*2;
std::cout << "<- o = " << o << "\n";
std::cout << "-> i = " << i << "\n";
std::cout << "-> n = " << n << "\n";
std::cout << "-> m = " << m << "\n";
std::cout << "-> v = " << v << "\n";
std::cout << "-> sum_of_squares(i, o, -i) = " << eve::sum_of_squares(i, o, -i) << "\n";
std::cout << "-> sum_of_squares(i, o, n) = " << eve::sum_of_squares(i, o, n) << "\n";
std::cout << "-> sum_of_squares[pedantic](i, o, -i) = " << eve::sum_of_squares[eve::pedantic](i, o, -i) << "\n";
std::cout << "-> sum_of_squares[pedantic](i, o, n) = " << eve::sum_of_squares[eve::pedantic](i, o, n) << "\n";
std::cout << "-> sum_of_squares[pedantic](o, o, n) = " << eve::sum_of_squares[eve::pedantic](o, o, n) << "\n";
std::cout << "-> sum_of_squares[pedantic](o, n, o) = " << eve::sum_of_squares[eve::pedantic](o, n, o) << "\n";
std::cout << "-> sum_of_squares[pedantic](n, o, o) = " << eve::sum_of_squares[eve::pedantic](n, o, o) << "\n";
std::cout << "-> sum_of_squares (o, o, n) = " << eve::sum_of_squares(o, o, n) << "\n";
std::cout << "-> sum_of_squares (o, n, o) = " << eve::sum_of_squares(o, n, o) << "\n";
std::cout << "-> sum_of_squares (n, o, o) = " << eve::sum_of_squares(n, o, o) << "\n";
std::cout << "-> sum_of_squares(n, n, n) = " << eve::sum_of_squares(n, n, n) << "\n";
std::cout << "-> sum_of_squares(m, o, o) = " << eve::sum_of_squares(m, o, o)<< "\n";
std::cout << "-> sum_of_squares(m, m, n) = " << eve::sum_of_squares(m, m, n)<< "\n";
std::cout << "-> sum_of_squares(i, n) = " << eve::sum_of_squares(i, n) << "\n";
std::cout << "-> sum_of_squares[pedantic](m, m) = " << eve::sum_of_squares[eve::pedantic](m, m)<< "\n";
std::cout << "-> sum_of_squares[pedantic](m, m, n) = " << eve::sum_of_squares[eve::pedantic](m, m, n)<< "\n";
std::cout << "-> sum_of_squares[pedantic](i, n) = " << eve::sum_of_squares[eve::pedantic](i, n) << "\n";
std::cout << "-> sum_of_squares[pedantic](v, v, n) = " << eve::sum_of_squares[eve::pedantic](v, v, n)<< "\n";
std::cout << "-> sum_of_squares[pedantic](m, m) = " << eve::sum_of_squares[eve::pedantic](m, m)<< "\n";
std::cout << "-> sum_of_squares(m, m, n) = " << eve::sum_of_squares(m, m, n)<< "\n";
std::cout << "-> sum_of_squares(i, n, n) = " << eve::sum_of_squares(i, n, n) << "\n";
std::cout << "-> sum_of_squares(i, n) = " << eve::sum_of_squares(i, n) << "\n";
std::cout << "-> sum_of_squares(v, v, n) = " << eve::sum_of_squares(v, v, n)<< "\n";
std::cout << "-> sum_of_squares(n, z) = " << eve::sum_of_squares(n, z)<< "\n";
std::cout << "-> sum_of_squares(z, n) = " << eve::sum_of_squares(z, n)<< "\n";
std::cout << "-> sum_of_squares[pedantic](n, z) = " << eve::sum_of_squares[eve::pedantic](n, z)<< "\n";
std::cout << "-> sum_of_squares[pedantic](z, n) = " << eve::sum_of_squares[eve::pedantic](z, n)<< "\n";
std::cout << "-> sum_of_squares[pedantic](n, n) = " << eve::sum_of_squares[eve::pedantic](n, n)<< "\n";
std::cout << "-> sum_of_squares[pedantic](i, n) = " << eve::sum_of_squares[eve::pedantic](n, n)<< "\n";
std::cout << "-> sum_of_squares[pedantic](n, i) = " << eve::sum_of_squares[eve::pedantic](n, n)<< "\n";
std::cout << "-> sum_of_squares[pedantic](v, v) = " << eve::sum_of_squares[eve::pedantic](v, v)<< "\n";
}
constexpr auto nan
Computes the IEEE quiet NaN constant.
Definition nan.hpp:67
constexpr auto eps
Computes a constant to the machine epsilon.
Definition eps.hpp:74
constexpr auto valmax
Computes the greatest representable value.
Definition valmax.hpp:67
constexpr auto inf
Computes the infinity ieee value.
Definition inf.hpp:67
constexpr auto sqrteps
Computes the square root of the machine epsilon.
Definition sqrteps.hpp:72
constexpr auto zero
Computes the constant 0.
Definition zero.hpp:78
constexpr auto strict
Turns the guarantee of lower or upper into a strict inequality.
Definition core.hpp:105
constexpr auto widen
Computes the result in the upgraded element type.
Definition core.hpp:106
constexpr auto lower
Guarantees a result no greater than the exact mathematical one.
Definition core.hpp:103
constexpr auto upper
Guarantees a result no smaller than the exact mathematical one.
Definition core.hpp:102
Lightweight type-wrapper.
Definition as.hpp:29
Conditional expression ignoring the k last lanes from a eve::simd_value.
Definition conditional.hpp:361
Wrapper for SIMD registers.
Definition wide.hpp:94