Using kernel_float::constant
When working with mixed precision types, you will find that working with constants presents a bit of a challenge.
For example, a simple expression such as 3.14 * x where x is of type vec<float, 2> will NOT be performed
in float precision as you might expect, but instead in double precision.
This happens since the left-hand side of this expression
(a constant) is a double and thus kernel_float will also cast the right-hand side to double.
To solve this problem, kernel_float offers a type called constant<T> that can be used to represent
constants. Any binary operations between a value of type U and a constant<T> will result in both
operands being cast to type U and the operation is performed in the precision of type U. This makes
constant<T> useful for representing constants in your code.
For example, consider the following code:
#include "kernel_float.h"
namespace kf = kernel_float;
int main() {
using Type = float;
const int N = 8;
static constexpr auto PI = kf::make_constant(3.14);
kf::vec<int, N> i = kf::range<int, N>();
kf::vec<Type, N> x = kf::cast<Type>(i) * PI;
kf::vec<Type, N> y = x * kf::sin(x);
Type result = kf::sum(y);
printf("result=%f", double(result));
return EXIT_SUCCESS;
}
This code example uses the make_constant utility function to create constant<T>.