E.V.E
v2023.02.15
Loading...
Searching...
No Matches
◆
sum_of_squares
eve::sum_of_squares = functor<sum_of_squares_t>
inline
constexpr
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
(kumi::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
}
eve::value
The concept value<T> is satisfied if and only if T satisfies either eve::scalar_value or eve::simd_va...
Definition
value.hpp:34
eve::sum_of_squares
constexpr auto sum_of_squares
tuple_callable object computing the sum_of_squares norm ( ) of its arguments.
Definition
sum_of_squares.hpp:91
eve::translate_t
typename decltype(detail::as_translated_type(as< T >{}))::type translate_t
Returns the final translated type of T.
Definition
translation.hpp:107
eve
EVE Main Namespace.
Definition
abi.hpp:19
Parameters
xs ...
:
real
arguments.
tup
: non empty tuple of arguments.
c
:
Conditional expression
masking the operation.
m
:
Logical value
masking the operation.
Return value
The value of the sum of the squared values of the arguments is returned.
equivalent to the call on the elements of the tuple.
internally uses
saturated
options.
returns \(\infty\) as soon as one of its parameter is infinite, regardless of possible
Nan
values.
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, 0
u
};
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"
;
}
eve::eps
constexpr auto eps
Computes a constant to the machine epsilon.
Definition
eps.hpp:74
eve::sqrteps
constexpr auto sqrteps
Computes the square root of the machine epsilon.
Definition
sqrteps.hpp:72
eve::as
Lightweight type-wrapper.
Definition
as.hpp:29
eve::ignore_last
Conditional expression ignoring the k last lanes from a eve::simd_value.
Definition
conditional.hpp:320
eve::wide
Wrapper for SIMD registers.
Definition
wide.hpp:94
eve