5 #include <gtest/gtest.h> 13 uavcan::StaticAssert<sizeof(uavcan::NativeFloatSelector<16>::Type) == 4>::
check();
14 uavcan::StaticAssert<sizeof(uavcan::NativeFloatSelector<32>::Type) == 4>::
check();
15 uavcan::StaticAssert<sizeof(uavcan::NativeFloatSelector<64>::Type) == 8>::
check();
16 uavcan::StaticAssert<sizeof(uavcan::NativeFloatSelector<80>::Type) >= 10>::
check();
25 typedef FloatSpec<16, CastModeSaturate> F16S;
26 typedef FloatSpec<32, CastModeTruncate> F32T;
27 typedef FloatSpec<64, CastModeSaturate> F64S;
29 ASSERT_FALSE(F16S::IsExactRepresentation);
31 ASSERT_FLOAT_EQ(9.77e-04F, F16S::epsilon());
33 ASSERT_TRUE(F32T::IsExactRepresentation);
35 ASSERT_FLOAT_EQ(std::numeric_limits<float>::epsilon(), F32T::epsilon());
37 ASSERT_TRUE(F64S::IsExactRepresentation);
39 ASSERT_DOUBLE_EQ(std::numeric_limits<double>::epsilon(), F64S::epsilon());
49 typedef FloatSpec<16, CastModeSaturate> F16S;
50 typedef FloatSpec<16, CastModeTruncate> F16T;
51 typedef FloatSpec<32, CastModeSaturate> F32S;
52 typedef FloatSpec<32, CastModeTruncate> F32T;
53 typedef FloatSpec<64, CastModeSaturate> F64S;
54 typedef FloatSpec<64, CastModeTruncate> F64T;
56 static const long double Values[] =
67 std::numeric_limits<double>::infinity(),
68 -std::numeric_limits<double>::infinity(),
71 static const int NumValues =
int(
sizeof(Values) /
sizeof(Values[0]));
73 static const long double ValuesF16S[] =
84 std::numeric_limits<F16S::StorageType>::infinity(),
85 -std::numeric_limits<F16S::StorageType>::infinity(),
88 static const long double ValuesF16T[] =
95 std::numeric_limits<F16S::StorageType>::infinity(),
96 -std::numeric_limits<F16S::StorageType>::infinity(),
97 std::numeric_limits<F16S::StorageType>::infinity(),
98 -std::numeric_limits<F16S::StorageType>::infinity(),
99 std::numeric_limits<F16S::StorageType>::infinity(),
100 -std::numeric_limits<F16S::StorageType>::infinity(),
111 for (
int i = 0; i < NumValues; i++)
129 #define CHECK(FloatType, expected_value) \ 131 StorageType<FloatType>::Type var = StorageType<FloatType>::Type(); \ 132 ASSERT_EQ(1, FloatType::decode(var, sc_rd, uavcan::TailArrayOptDisabled)); \ 133 if (!std::isnan(expected_value)) { \ 134 ASSERT_DOUBLE_EQ(expected_value, var); } \ 136 ASSERT_EQ(!!std::isnan(expected_value), !!std::isnan(var)); } \ 139 for (
int i = 0; i < NumValues; i++)
141 CHECK(F16S,
float(ValuesF16S[i]));
142 CHECK(F16T,
float(ValuesF16T[i]));
143 CHECK(F32S,
float(Values[i]));
144 CHECK(F32T,
float(Values[i]));
145 CHECK(F64S,
double(Values[i]));
146 CHECK(F64T,
double(Values[i]));
152 TEST(FloatSpec, Float16Representation)
158 typedef FloatSpec<16, CastModeSaturate> F16S;
159 typedef FloatSpec<16, CastModeTruncate> F16T;
175 static const std::string Reference =
183 ASSERT_EQ(Reference, bs_wr.toString());
#define CHECK(FloatType, expected_value)
UAVCAN_EXPORT const T & max(const T &a, const T &b)